Daftar Isi
Dalam tutorial ini, kita akan melihat secara mendalam tentang cara menggunakan regex untuk mencocokkan string di Excel.
Saat Anda perlu menemukan nilai tertentu dalam rentang sel, Anda akan menggunakan fungsi MATCH atau XMATCH. Saat mencari string tertentu dalam sel, fungsi FIND dan SEARCH sangat berguna. Dan bagaimana Anda tahu jika sel berisi informasi yang cocok dengan pola yang diberikan? Jelas, dengan menggunakan ekspresi reguler. Tapi di luar kotak Excel tidak mendukung regex! Jangan khawatir, kami akan memaksanya :)
Fungsi Excel VBA Regex untuk mencocokkan string
Seperti yang cukup jelas dari judulnya, untuk menggunakan ekspresi reguler di Excel, Anda perlu membuat fungsi Anda sendiri. Untungnya, VBA Excel memiliki fungsi inbuilt RegExp yang dapat Anda gunakan dalam kode Anda seperti yang ditunjukkan di bawah ini:
Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'array untuk menyimpan hasil Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'indeks baris saat ini dalam rentang sumber, indeks kolom saat ini dalam rentang sumber, jumlah baris, jumlah kolom On Error GoTo ErrHandlRegExpMatch = arRes Set regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case Then regex.ignorecase = False Else regex.ignorecase = True End If cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputRows, 1 To cntInputCols) For iInputCurRow = 1 To cntInputRows ForiInputCurCol = 1 To cntInputCols arRes(iInputCurRow, iInputCurCol) = regex.Test(input_range.Cells(iInputCurRow, iInputCurCol).Value) Next Next RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) End FunctionTempelkan kode di editor VBA, dan kode baru Anda RegExpMatch Jika Anda tidak terlalu berpengalaman dengan VBA, panduan ini mungkin berguna: Cara memasukkan kode VBA di Excel.
Catatan. Setelah menyisipkan kode, ingatlah untuk menyimpan file Anda sebagai file buku kerja berkemampuan makro (.xlsm).
Sintaks RegExpMatch
The RegExpMatch Fungsi memeriksa apakah ada bagian dari string sumber yang cocok dengan ekspresi reguler. Hasilnya adalah nilai Boolean: TRUE jika setidaknya satu kecocokan ditemukan, jika tidak FALSE.
Fungsi kustom kami memiliki 3 argumen - dua yang pertama diperlukan dan yang terakhir adalah opsional:
RegExpMatch(teks, pola, [match_case])Di mana:
- Teks (wajib) - satu atau lebih string untuk dicari. Dapat diberikan sebagai referensi sel atau rentang.
- Pola (wajib) - ekspresi reguler yang akan dicocokkan. Ketika ditempatkan secara langsung dalam formula, pola harus diapit oleh tanda kutip ganda.
- Match_case (opsional) - mendefinisikan tipe pencocokan. Jika TRUE atau dihilangkan (default), pencocokan case-sensitive dilakukan; jika FALSE - case-insensitive.
Fungsi ini berfungsi di semua versi Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 dan Excel 2010.
3 hal yang harus Anda ketahui tentang RegExpMatch
Sebelum kita sampai ke kalkulasi praktis, harap perhatikan poin-poin berikut ini yang menjelaskan beberapa hal teknis:
- Fungsi ini bisa memproses sel tunggal atau rentang sel Dalam kasus terakhir, hasilnya dikembalikan dalam sel tetangga dalam bentuk larik dinamis, atau spill range, seperti yang ditunjukkan dalam contoh ini.
- Secara default, fungsinya adalah peka huruf besar-kecil Untuk mengabaikan kasus teks, atur match_case argumen ke FALSE. Karena keterbatasan VBA Regexp, pola case-insensitive (?i) tidak didukung.
- Jika pola yang valid tidak ditemukan, fungsi mengembalikan FALSE; jika pola pola tidak valid , terjadi kesalahan #VALUE!
Di bawah ini, Anda akan menemukan beberapa contoh pencocokan regex yang dibuat untuk tujuan demonstrasi. Kami tidak dapat menjamin bahwa pola kami akan bekerja tanpa kesalahan dengan rentang data input yang lebih luas di lembar kerja Anda yang sebenarnya. Sebelum memasukkannya ke dalam produksi, pastikan untuk menguji dan menyesuaikan pola sampel kami sesuai dengan kebutuhan Anda.
Cara menggunakan regex untuk mencocokkan string di Excel
Bila semua string yang ingin Anda cocokkan memiliki pola yang sama, ekspresi reguler adalah solusi ideal.
Misalkan Anda memiliki rentang sel (A5:A9) yang berisi berbagai detail tentang beberapa item. Anda ingin mengetahui sel mana yang memiliki SKU. Dengan asumsi bahwa setiap SKU terdiri dari 2 huruf kapital, tanda hubung, dan 3 digit, Anda dapat mencocokkannya menggunakan ekspresi berikut.
Pola : \b[A-Z]{2}-\d{3}\b
Di mana [A-Z]{2} berarti 2 huruf besar apa pun dari A hingga Z dan \d{3} berarti 3 digit apa pun dari 0 hingga 9. Karakter \b menunjukkan batas kata, yang berarti SKU adalah kata terpisah, dan bukan bagian dari string yang lebih besar seperti 23-MAR-2022.
Dengan pola yang telah ditetapkan, kita dapat beralih ke penulisan rumus. Pada dasarnya, menggunakan fungsi kustom tidak berbeda dengan fungsi asli. Segera setelah Anda mulai mengetik rumus, nama fungsi akan muncul dalam daftar yang disarankan oleh Excel's AutoComplete. Namun, ada beberapa nuansa dalam Dynamic Array Excel (Microsoft 365 dan Excel 2021) dan Excel tradisional (2019 dan versi yang lebih lama).
Mencocokkan string dalam satu sel
Untuk mencocokkan string dalam satu sel, rujuk ke sel itu di argumen pertama. Argumen kedua seharusnya berisi ekspresi reguler.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
Pola juga bisa disimpan dalam sel yang sudah ditentukan sebelumnya, yang dikunci dengan referensi absolut ($A$2):
=RegExpMatch(A5, $A$2)
Setelah memasukkan rumus di sel pertama, Anda bisa menyeretnya ke semua baris lainnya.
Metode ini bekerja dengan indah dalam semua versi Excel .
Mencocokkan string dalam beberapa sel sekaligus
Untuk mencocokkan beberapa string dengan satu rumus, sertakan referensi rentang di argumen pertama:
=RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")
Dalam Excel 365 dan Excel 2021 yang mendukung array dinamis, cara kerjanya seperti ini - Anda mengetik rumus di sel pertama, tekan Enter , dan rumus secara otomatis tumpah ke sel di bawahnya.
Dalam Excel 2019 dan sebelumnya, ini hanya berfungsi sebagai rumus array CSE tradisional, yang dimasukkan dalam rentang sel dan diselesaikan dengan menekan Ctrl + Shift + Enter kunci bersama.
Regex untuk mencocokkan nomor
Untuk mencocokkan digit tunggal apa pun dari 0 hingga 9, gunakan \d Tergantung pada tugas khusus Anda, tambahkan quantifier yang sesuai atau buat pola yang lebih kompleks.
Regex untuk mencocokkan angka apa pun
Untuk mencocokkan angka berapapun panjangnya, letakkan kuantifier + tepat setelah karakter /d, yang mengatakan untuk mencari angka yang mengandung 1 digit atau lebih.
Pola : \d+
=RegExpMatch(A5:A9, "\d+")
Regex untuk mencocokkan angka dengan panjang tertentu
Jika tujuan Anda adalah untuk mencocokkan nilai numerik yang mengandung sejumlah digit tertentu, gunakan \d bersama dengan quantifier yang sesuai.
Misalnya, untuk mencocokkan nomor faktur yang terdiri dari tepat 7 digit, Anda akan menggunakan \d{7}. Namun, harap diingat bahwa ini akan cocok dengan 7 digit di mana saja dalam string termasuk angka 10 digit atau 100 digit. Jika ini bukan yang Anda cari, letakkan batas kata \b di kedua sisi.
Pola : \b\d{7}\b
=RegExpMatch(A5:A9, "\b\d{7}\b")
Regex untuk mencocokkan nomor telepon
Karena nomor telepon bisa ditulis dalam berbagai format, maka pencocokannya memerlukan ekspresi reguler yang lebih canggih.
Dalam dataset di bawah ini, kita akan mencari 10 digit angka yang memiliki 3 digit dalam 2 kelompok pertama dan 4 digit dalam kelompok terakhir. Kelompok-kelompok tersebut dapat dipisahkan dengan titik, tanda hubung atau spasi. Kelompok pertama mungkin atau mungkin tidak diapit oleh tanda kurung.
Pola: (\(\d{3}\)
Memecah ekspresi reguler ini, inilah yang kita dapatkan:
- Bagian pertama (\(\d{3}\)
- Bagian [-\.\s]? berarti 0 atau 1 kemunculan karakter apa pun dalam tanda kurung siku: tanda hubung, titik, atau spasi.
- Selanjutnya, ada satu lagi kelompok 3 digit d{3} yang diikuti oleh tanda hubung, titik, atau spasi [\-\.\s]? muncul 0 atau 1 kali.
- Kelompok terakhir dari 4 digit \d{4} diikuti oleh batas kata \b untuk memperjelas bahwa nomor telepon tidak dapat menjadi bagian dari nomor yang lebih besar.
Dengan string asli di A5 dan ekspresi reguler di A2, rumusnya mengambil bentuk ini:
=RegExpMatch(A5, $A$2)
... dan bekerja persis seperti yang diharapkan:
Catatan:
- Kode internasional tidak diperiksa, jadi mungkin ada atau mungkin tidak ada.
- Dalam ekspresi reguler, \s adalah singkatan dari karakter spasi seperti spasi, tab, carriage return, atau baris baru. Untuk mengizinkan hanya spasi, gunakan [-\. ] alih-alih [-\.\s].
- [^13] akan mencocokkan karakter tunggal apa pun yang bukan 1 atau 3.
- [^1-3] akan mencocokkan karakter tunggal apa pun yang bukan 1, 2, atau 3 (yaitu, digit apa pun dari 1 hingga 3).
- Regex di atas hanya berfungsi untuk garis tunggal Dalam kasus string milti-baris, karakter ^ dan $ cocok dengan awal dan akhir setiap baris, bukan awal dan akhir string input, oleh karena itu regex hanya mencari di baris pertama.
- Untuk mencocokkan string yang jangan mulai dengan teks tertentu , gunakan ekspresi reguler seperti ^(?!lemon).*$
- Untuk mencocokkan string yang jangan diakhiri dengan teks tertentu , sertakan jangkar string akhir ke dalam pola pencarian: ^((?!lemons$).)*$
- Nama pengguna dapat mencakup huruf, angka, garis bawah, titik dan tanda hubung. Dengan mengingat bahwa \w cocok dengan huruf, digit, atau garis bawah apa pun, kami mendapatkan regex berikut: [\w\.\-]+
- Nama domain dapat mencakup huruf besar dan kecil, digit, tanda hubung (tetapi tidak di posisi pertama atau terakhir) dan titik (dalam kasus subdomain). Karena garis bawah tidak diperbolehkan, alih-alih \w kami menggunakan 3 set karakter yang berbeda: [A-Za-z0-9] + [A-Za-z0-9\.\-] * [A-Za-z0-9] +
- Domain tingkat atas terdiri dari sebuah titik yang diikuti oleh huruf besar dan huruf kecil. Ini dapat berisi dari 2 hingga 24 huruf (TLD terpanjang yang ada saat ini): \.[A-Za-z]{2,24}.
- Menyediakan referensi range ke RegExpMatch, sehingga mengembalikan array nilai TRUE dan FALSE.
- Gunakan negasi ganda (--) untuk memaksa nilai logika menjadi satu dan nol.
- Dapatkan fungsi SUM untuk menjumlahkan 1 dan 0 dalam larik yang dihasilkan.
- Pada Data Ablebits tab, di tab Teks kelompok, klik Alat Regex .
- Pada Alat Regex panel, lakukan yang berikut ini:
- Pilih string sumber.
- Masukkan pola Anda.
- Pilih Cocok pilihan.
- Untuk memiliki hasil sebagai formula, bukan nilai, pilih tombol Sisipkan sebagai formula kotak centang.
- Klik Cocok tombol.
- Fungsi ini bisa berupa disisipkan secara langsung di dalam sel melalui standar Fungsi Sisipkan kotak dialog, di mana ia dikategorikan di bawah AblebitsUDFs .
- Secara default, ekspresi reguler ditambahkan ke rumus, tetapi Anda juga dapat menyimpannya di sel terpisah. Untuk ini, cukup gunakan referensi sel untuk argumen ke-2.
- Secara default, fungsinya adalah peka huruf besar-kecil Untuk pencocokan case-insensitive, gunakan pola (?i).
Regex untuk TIDAK mencocokkan karakter
Untuk menemukan string yang TIDAK mengandung karakter tertentu, Anda dapat menggunakan kelas karakter negasi [^ ] yang cocok dengan apa pun yang TIDAK dalam tanda kurung. Sebagai contoh:
Dalam daftar nomor telepon, misalkan Anda ingin menemukan nomor telepon yang tidak memiliki kode negara. Dengan mengingat bahwa setiap kode internasional menyertakan tanda +, Anda dapat menggunakan kelas karakter [^\+] untuk menemukan string yang tidak mengandung tanda tambah. Penting untuk disadari bahwa ekspresi di atas cocok dengan karakter tunggal apa pun yang bukan +. Karena nomor telepon dapat berada di mana saja dalam string, bukanharus di awal, * quantifier ditambahkan untuk memeriksa setiap karakter berikutnya. Jangkar awal ^ dan akhir $ memastikan bahwa seluruh string diproses. Hasilnya, kita mendapatkan ekspresi reguler di bawah ini yang mengatakan "jangan cocok dengan karakter + di posisi mana pun dalam string".
Pola : ^[^\+]*$
=RegExpMatch(A5, "^[^\+]*$")
Regex untuk TIDAK mencocokkan string
Meskipun tidak ada sintaks ekspresi reguler khusus untuk tidak mencocokkan string tertentu, Anda dapat meniru perilaku ini dengan menggunakan lookahead negatif.
Seandainya Anda ingin menemukan string yang tidak mengandung kata "lemon". Ekspresi reguler ini akan bekerja dengan baik:
Pola : ^((?!lemon).)*$
Jelas, beberapa penjelasan diperlukan di sini. Lookahead negatif (?!lemons) melihat ke kanan untuk melihat apakah tidak ada kata "lemons" di depan. Jika "lemons" tidak ada di sana, maka titik cocok dengan karakter apa pun kecuali jeda baris. Ekspresi di atas hanya melakukan satu kali pengecekan, dan * quantifier mengulanginya nol kali atau lebih, dari awal string yang berlabuh dengan ^ hingga akhir string yang berlabuh dengan$.
Untuk mengabaikan kasus teks, kita mengatur argumen ke-3 ke FALSE untuk membuat fungsi kita tidak peka huruf besar-kecil:
=RegExpMatch(A5, $A$2, FALSE)
Kiat dan catatan:
Pencocokan yang tidak peka huruf besar-kecil
Dalam ekspresi reguler klasik, ada pola khusus untuk pencocokan case-insensitive (?i), yang tidak didukung dalam VBA RegExp. Untuk mengatasi keterbatasan ini, fungsi kustom kami menerima argumen opsional ke-3 bernama match_case Untuk melakukan pencocokan case-insensitive, cukup set ke FALSE.
Katakanlah Anda ingin mengidentifikasi tanggal seperti 1-Mar-22 atau 01-MAR-2022. Untuk mencocokkan dd-mmm-yyyy dan d-mmm-yy format, kita menggunakan ekspresi reguler berikut ini.
Pola : \b\d{1,2}-(Jan
Ekspresi kami mencari sekelompok 1 atau 2 digit, diikuti oleh tanda hubung, diikuti oleh salah satu singkatan bulan yang dipisahkan oleh
Mengapa tidak menggunakan pola yang lebih sederhana seperti \d{1,2}-[A-Za-z]{3}-\d{2,4}\b? Untuk mencegah kecocokan positif palsu seperti 01-ABC-2020.
Masukkan pola di A2, dan Anda akan mendapatkan rumus berikut:
=RegExpMatch(A5, $A$2, FALSE)
Regex untuk mencocokkan alamat email yang valid
Seperti yang diketahui secara umum, alamat email terdiri dari 4 bagian: nama pengguna, simbol @, nama domain (server email) dan domain tingkat atas (seperti .com, .edu, .org, dll.). Untuk memeriksa validitas alamat email, kita perlu mereplikasi struktur di atas menggunakan ekspresi reguler.
Pola : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b
Untuk lebih memahami apa yang terjadi di sini, mari kita lihat lebih dekat pada setiap bagian:
Catatan. Pola ini mengasumsikan nama domain berisi 2 atau lebih karakter alfanumerik.
Dengan teks asli dalam A5 dan polanya dalam A5, rumusnya berbentuk seperti ini:
=RegExpMatch(A5, $A$2)
Atau Anda bisa menggunakan ekspresi reguler yang lebih sederhana untuk validasi email dengan set karakter huruf kecil atau huruf besar:
Pola : \b[\w\.\-]+@[a-z0-9]+[a-z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b
Tetapi buatlah rumus Anda tidak peka huruf besar-kecil:
=RegExpMatch(A5, $A$2, FALSE)
Rumus IF Excel dengan regex yang cocok
Karena fakta bahwa fungsi bawaan dan kustom berjalan dengan baik, tidak ada yang akan mencegah Anda menggunakannya bersama-sama dalam satu rumus.
Untuk mengembalikan atau menghitung sesuatu jika ekspresi reguler cocok dan sesuatu yang lain jika tidak cocok, sematkan fungsi RegExpMatch kustom dalam teks logika IF:
IF(RegExpMatch(...), [value_if_true], [value_if_false])Misalnya, jika string di A5 berisi alamat email yang valid, Anda bisa mengembalikan "Yes"; jika tidak, "No".
=IF(RegExpMatch(A5, $A$2,), "Ya", "Tidak")
Hitung jika regex cocok
Karena fungsi Excel asli tidak mendukung ekspresi reguler, tidak mungkin untuk meletakkan regex secara langsung dalam fungsi COUNTIS atau COUNTIFS. Untungnya, Anda dapat meniru fungsi ini menggunakan fungsi kustom kami.
Misalkan Anda telah menggunakan regex untuk mencocokkan nomor telepon dan menampilkan hasilnya di kolom B. Untuk mengetahui berapa banyak sel yang berisi nomor telepon, Anda hanya perlu menghitung nilai TRUE di B5: B9. Dan itu dapat dengan mudah dilakukan dengan menggunakan rumus COUNTIF standar:
=COUNTIF(B5:B9, TRUE)
Tidak ingin ada kolom tambahan di lembar kerjamu? Tidak masalah. Dengan mengingat bahwa fungsi kustom kita bisa memproses beberapa cell sekaligus dan SUM Excel bisa menjumlahkan nilai dalam sebuah array, inilah yang kamu lakukan:
=SUM(--RegExpMatch(A5:A9, $A$2))
Pencocokan Regex dengan Ultimate Suite
Pengguna Ultimate Suite kami dapat memanfaatkan empat fungsi Regex yang kuat tanpa menambahkan kode VBA apa pun ke buku kerja mereka karena mereka terintegrasi dengan lancar ke dalam Excel selama penginstalan add-in. Fungsi kustom kami diproses oleh mesin RegEx .NET standar dan mendukung ekspresi reguler klasik berfitur lengkap.
Cara menggunakan fungsi RegexMatch kustom
Dengan asumsi Anda telah menginstal Ultimate Suite versi terbaru (2021.4 atau yang lebih baru), Anda dapat membuat rumus Regex Match dalam dua langkah sederhana:
Sesaat kemudian, sang AblebitsRegexMatch dimasukkan dalam kolom baru di sebelah kanan data Anda.
Pada gambar di bawah ini, fungsi memeriksa apakah string di kolom A berisi angka 7 digit atau tidak.
Tips:
Untuk informasi lebih lanjut, silakan lihat fungsi AblebitsRegexMatch.
Itulah cara melakukan pencocokan ekspresi reguler di Excel. Saya berterima kasih telah membaca dan berharap dapat melihat Anda di blog kami minggu depan!
Unduhan yang tersedia
Contoh Pencocokan Regex Excel (file .xlsm)
Ultimate Suite 14 hari versi yang berfungsi penuh (file .exe)