Isi kandungan
Dalam tutorial ini, kita akan melihat secara mendalam tentang cara menggunakan regex untuk memadankan rentetan dalam Excel.
Apabila anda perlu mencari nilai tertentu dalam julat daripada sel, anda akan menggunakan fungsi MATCH atau XMATCH. Apabila mencari rentetan tertentu dalam sel, fungsi FIND dan SEARCH berguna. Dan bagaimana anda tahu jika sel mengandungi maklumat yang sepadan dengan corak tertentu? Jelas sekali, dengan menggunakan ungkapan biasa. Tetapi di luar kotak Excel tidak menyokong regex! Jangan risau, kami akan memaksanya :)
Fungsi Excel VBA Regex untuk memadankan rentetan
Memandangkan ia agak jelas daripada tajuk, untuk menggunakan ungkapan biasa dalam Excel, anda perlu mencipta fungsi anda sendiri. Nasib baik, VBA Excel mempunyai objek RegExp terbina, yang boleh anda gunakan dalam kod anda seperti ditunjukkan di bawah:
Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Varian Dim arRes() Sebagai Variant 'array untuk menyimpan hasil Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols Selagi 'indeks baris semasa dalam julat sumber, indeks lajur semasa dalam julat sumber, kiraan baris, kiraan lajur Pada Ralat GoTo ErrHandl RegExpMatch = 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 tamatungkapan.Corak : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\- ]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b
Untuk lebih memahami perkara yang berlaku di sini, mari kita lihat dengan lebih dekat setiap bahagian :
- Nama Pengguna mungkin termasuk huruf, nombor, garis bawah, titik dan sempang. Perlu diingat bahawa \w sepadan dengan mana-mana huruf, digit atau garis bawah, kami mendapat regex berikut: [\w\.\-]+
- Nama domain mungkin termasuk huruf besar dan huruf kecil, digit, sempang (tetapi bukan pada kedudukan pertama atau terakhir) dan titik (dalam kes subdomain). Memandangkan garis bawah tidak dibenarkan, bukannya \w kami menggunakan 3 set aksara berbeza: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
- Domain peringkat atas terdiri daripada satu titik diikuti dengan huruf besar dan huruf kecil. Ia boleh mengandungi daripada 2 hingga 24 huruf (TLD terpanjang yang wujud pada masa ini): \.[A-Za-z]{2,24}
Nota. Corak menganggap nama domain mengandungi 2 atau lebih aksara abjad angka.
Dengan teks asal dalam A5 dan corak dalam A5, formula mengambil bentuk ini:
=RegExpMatch(A5, $A$2)
Atau anda boleh menggunakan biasa yang lebih ringkas ungkapan untuk pengesahan e-mel dengan sama ada set aksara kecil atau huruf besar:
Corak : \b[\w\.\-]+@[a-z0-9]+[a- z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b
Tetapi jadikan formula anda tidak peka huruf besar-besaran:
=RegExpMatch(A5, $A$2, FALSE)
Formula IF Excel dengan regex sepadan
Disebabkan fakta bahawa terbina dan tersuaifungsi berjalan dengan baik, tiada apa yang akan menghalang anda daripada menggunakannya bersama-sama dalam satu formula.
Untuk mengembalikan atau mengira sesuatu jika ungkapan biasa dipadankan dan sesuatu yang lain jika ia tidak sepadan, benamkan RegExpMatch tersuai fungsi dalam teks logik IF:
IF(RegExpMatch(…), [value_if_true], [value_if_false])Sebagai contoh, jika rentetan dalam A5 mengandungi alamat e-mel yang sah, anda boleh mengembalikan "Ya"; sebaliknya "Tidak".
=IF(RegExpMatch(A5, $A$2,), "Yes", "No")
Kira jika regex dipadankan
Oleh kerana fungsi Excel asli tidak menyokong ungkapan biasa, ia adalah tidak mungkin untuk meletakkan regex terus dalam fungsi COUNTIS atau COUNTIFS. Nasib baik, anda boleh mencontohi fungsi ini menggunakan fungsi tersuai kami.
Andaikata anda telah menggunakan regex untuk memadankan nombor telefon dan mengeluarkan hasil dalam lajur B. Untuk mengetahui bilangan sel yang mengandungi nombor telefon, anda hanya perlu untuk mengira nilai BENAR dalam B5:B9. Dan itu boleh dilakukan dengan mudah menggunakan formula COUNTIF standard:
=COUNTIF(B5:B9, TRUE)
Tidak mahu sebarang lajur tambahan dalam lembaran kerja anda? Tiada masalah. Perlu diingat bahawa fungsi tersuai kami boleh memproses berbilang sel pada satu masa dan SUM Excel boleh menambah nilai dalam tatasusunan, berikut adalah perkara yang anda lakukan:
- Bekalkan rujukan julat kepada RegExpMatch, jadi ia mengembalikan tatasusunan nilai BENAR dan SALAH.
- Gunakan penolakan berganda (--) untuk memaksa nilai logik kepada satu dansifar.
- Dapatkan fungsi SUM untuk menambah 1 dan 0 dalam tatasusunan yang terhasil.
=SUM(--RegExpMatch(A5:A9, $A$2))
Padanan regex dengan Ultimate Suite
Pengguna Ultimate Suite kami boleh memanfaatkan empat fungsi Regex yang berkuasa tanpa menambahkan sebarang kod VBA pada buku kerja mereka kerana ia disepadukan dengan lancar ke dalam Excel semasa pemasangan tambahan. Fungsi tersuai kami diproses oleh enjin .NET RegEx standard dan menyokong ungkapan biasa klasik berciri penuh.
Cara menggunakan fungsi RegexMatch tersuai
Dengan mengandaikan anda telah memasang versi terkini Ultimate Suite ( 2021.4 atau lebih baru), anda boleh mencipta formula Regex Match dalam dua langkah mudah:
- Pada tab Ablebits Data , dalam kumpulan Teks , klik Alat Regex .
- Pilih rentetan sumber.
- Masukkan corak anda.
- Pilih pilihan Padan .
- Untuk mendapatkan hasil sebagai formula, bukan nilai, pilih Sisipkan sebagai formula kotak semak.
- Klik butang Padankan .
Sejurus kemudian, fungsi AblebitsRegexMatch dimasukkan dalam lajur baharu di sebelah kanan data anda.
Dalam tangkapan skrin di bawah, fungsi menyemak sama ada rentetan dalam lajur A mengandungi 7 digit nombor atau tidak.
Petua:
- Fungsinya boleh dimasukkan terus dalam sel melalui kotak dialog Insert Function standard, di mana ia dikategorikan di bawah AblebitsUDFs .
- Secara lalai, ungkapan biasa ditambahkan pada formula, tetapi anda juga boleh menyimpan ia dalam sel yang berasingan. Untuk ini, hanya gunakan rujukan sel untuk hujah ke-2.
- Secara lalai, fungsi ini adalah sensitif huruf besar-kecil . Untuk padanan tidak peka huruf besar-besaran, gunakan corak (?i).
Untuk maklumat lanjut, sila lihat fungsi AblebitsRegexMatch.
Begitulah cara melakukan padanan ungkapan biasa dalam Excel. Saya mengucapkan terima kasih kerana membaca dan berharap dapat berjumpa anda di blog kami minggu hadapan!
Muat turun yang tersedia
Contoh Padanan Regex Excel (fail.xlsm)
Suite Ultimate 14- hari versi berfungsi sepenuhnya (fail .exe)
Jika cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputRows, 1 To cntInputCols) For iInputCurRow = 1 To cntInputRows For iInputCurCol = 1 To cntRow(iColsInputRows.Trex) .Cells(iInputCurRow, iInputCurCol).Value) Seterusnya Seterusnya RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) End FunctionTampal kod dalam editor VBA dan fungsi RegExpMatch baharu anda ialah sedia untuk digunakan. Jika anda tidak begitu berpengalaman dengan VBA, panduan ini mungkin membantu: Cara memasukkan kod VBA dalam Excel.
Nota. Selepas memasukkan kod, ingat untuk menyimpan fail anda sebagai buku kerja yang didayakan makro (.xlsm).
Sintaks RegExpMatch
Fungsi RegExpMatch menyemak sama ada mana-mana bahagian rentetan sumber sepadan dengan ungkapan biasa. Hasilnya ialah nilai Boolean: TRUE jika sekurang-kurangnya satu padanan ditemui, FALSE sebaliknya.
Fungsi tersuai kami mempunyai 3 argumen - dua yang pertama diperlukan dan yang terakhir adalah pilihan:
RegExpMatch(text , corak, [match_case])Di mana:
- Teks (diperlukan) - satu atau lebih rentetan untuk dicari. Boleh dibekalkan sebagai rujukan sel atau julat.
- Corak (diperlukan) - ungkapan biasa untuk dipadankan. Apabila diletakkan terus dalam formula, corak mesti disertakan dalam petikan berganda.
- Match_case (pilihan) - mentakrifkan padananmenaip. Jika BENAR atau ditinggalkan (lalai), padanan sensitif huruf besar-besaran dilakukan; jika FALSE - tidak sensitif huruf besar dan kecil.
Fungsi berfungsi dalam semua versi Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 dan Excel 2010.
3 perkara yang anda perlu tahu tentang RegExpMatch
Sebelum kita sampai ke pengiraan praktikal, sila ambil perhatian perkara berikut yang menjelaskan beberapa teknikal:
- Fungsi ini boleh memproses sel tunggal atau julat sel . Dalam kes kedua, keputusan dikembalikan dalam sel bersebelahan dalam bentuk tatasusunan dinamik atau julat tumpahan, seperti yang ditunjukkan dalam contoh ini.
- Secara lalai, fungsi adalah sensitif huruf besar-kecil . Untuk mengabaikan kes teks, tetapkan argumen match_case kepada FALSE. Oleh kerana pengehadan VBA Regexp, corak tidak peka huruf besar-kecil (?i) tidak disokong.
- Jika corak yang sah tidak ditemui, fungsi mengembalikan FALSE; jika corak tidak sah , #VALUE! ralat berlaku.
Di bawah, anda akan menemui beberapa contoh padanan regex yang dibuat untuk tujuan demonstrasi. Kami tidak dapat menjamin bahawa corak kami akan berfungsi dengan sempurna dengan julat data input yang lebih luas dalam lembaran kerja sebenar anda. Sebelum membuat pengeluaran, pastikan anda menguji dan melaraskan corak sampel kami mengikut keperluan anda.
Cara menggunakan regex untuk memadankan rentetan dalam Excel
Apabila semua rentetan yang anda mahu padankan mempunyai corak yang sama,ungkapan biasa ialah penyelesaian yang ideal.
Andaikan anda mempunyai julat sel (A5:A9) yang mengandungi pelbagai butiran tentang beberapa item. Anda ingin mengetahui sel mana yang mempunyai SKU. Dengan mengandaikan bahawa setiap SKU terdiri daripada 2 huruf besar, tanda sempang dan 3 digit, anda boleh memadankannya menggunakan ungkapan berikut.
Corak : \b[A-Z]{2}-\ d{3}\b
Di mana [A-Z]{2} bermaksud mana-mana 2 huruf besar dari A hingga Z dan \d{3} bermaksud mana-mana 3 digit dari 0 hingga 9. Aksara \b menandakan perkataan sempadan, yang bermaksud SKU ialah perkataan yang berasingan dan bukan sebahagian daripada rentetan yang lebih besar seperti 23-MAR-2022.
Dengan corak yang ditetapkan, kita boleh terus menulis formula. Pada asasnya, menggunakan fungsi tersuai tidak berbeza dengan fungsi asli. Sebaik sahaja anda mula menaip formula, nama fungsi akan muncul dalam senarai yang dicadangkan oleh AutoComplete Excel. Walau bagaimanapun, terdapat beberapa nuansa dalam Dynamic Array Excel (Microsoft 365 dan Excel 2021) dan Excel tradisional (2019 dan versi yang lebih lama).
Padankan rentetan dalam satu sel
Untuk memadankan rentetan dalam sel tunggal, rujuk sel itu dalam hujah pertama. Argumen kedua sepatutnya mengandungi ungkapan biasa.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
Corak juga boleh disimpan dalam sel pratakrif, yang dikunci dengan rujukan mutlak ($A$2):
=RegExpMatch(A5, $A$2)
Selepas memasukkan formula dalam sel pertama, anda boleh menyeretnya ke bawah ke semua baris lain.
Kaedah iniberfungsi dengan baik dalam semua versi Excel .
Padankan rentetan dalam berbilang sel sekaligus
Untuk memadankan berbilang rentetan dengan formula tunggal, sertakan rujukan julat dalam hujah pertama:
=RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")
Dalam Excel 365 dan Excel 2021 yang menyokong tatasusunan dinamik, ia berfungsi dengan cara ini - anda menaip formula dalam sel pertama, tekan Enter , dan formula secara automatik tumpah ke dalam sel di bawah.
Dalam Excel 2019 dan lebih awal, ia hanya berfungsi sebagai formula tatasusunan CSE tradisional, yang dimasukkan dalam julat sel dan dilengkapkan dengan menekan kekunci Ctrl + Shift + Enter bersama-sama.
Regex untuk memadankan nombor
Untuk memadankan mana-mana digit tunggal daripada 0 hingga 9, gunakan aksara \d dalam regex. Bergantung pada tugas tertentu anda, tambahkan pengkuantiti yang sesuai atau cipta corak yang lebih kompleks.
Regex untuk memadankan sebarang nombor
Untuk memadankan sebarang nombor dengan sebarang panjang, letakkan pengkuantiti + tepat selepas / aksara d, yang mengatakan untuk mencari nombor yang mengandungi 1 atau lebih digit.
Corak : \d+
=RegExpMatch(A5:A9, "\d+")
Regex untuk memadankan bilangan panjang tertentu
Jika matlamat anda adalah untuk memadankan nilai angka yang mengandungi bilangan digit tertentu, maka gunakan \d bersama-sama dengan pengkuantiti yang sesuai.
Sebagai contoh, untuk memadankan nombor invois yang mengandungi tepat 7 digit, anda akan menggunakan \d{7}. Walau bagaimanapun, sila ingat bahawa ia akan sepadan dengan 7seperti yang dijangkakan:
Nota:
- Kod antarabangsa tidak disemak, jadi ia mungkin ada atau tidak.
- Dalam ungkapan biasa, \s bermaksud sebarang aksara ruang putih seperti ruang, tab, pemulangan pengangkutan atau baris baharu. Untuk membenarkan ruang sahaja, gunakan [-\. ] bukannya [-\.\s].
- [^13] akan memadankan mana-mana aksara tunggal yang bukan 1 atau 3.
- [^1-3] akan sepadan dengan mana-mana aksara tunggal yang bukan 1, 2 atau 3 (iaitu sebarang digit dari 1 hingga 3).
- Regex di atas hanya berfungsi untuk rentetan baris tunggal . Dalam kes rentetan garisan militi, aksara ^ dan $ sepadan dengan permulaan dan penghujung setiap baris dan bukannya permulaan dan penghujung rentetan input, oleh itu regex hanya mencari dalam baris pertama.
- Untuk memadankan rentetan yang tidak bermula dengan teks tertentu , gunakan ungkapan biasa seperti ^(?!lemon).*$
- Untuk memadankan rentetan yang tidak berakhir dengan teks tertentu , sertakanrentetan akhir menambat ke dalam corak carian: ^((?!lemon$).)*$
Regex kepada TIDAK sepadan dengan aksara
Untuk mencari rentetan yang TIDAK mengandungi aksara tertentu, anda boleh menggunakan kelas aksara yang dinafikan [^ ] yang sepadan apa-apa TIDAK dalam kurungan. Contohnya:
Dalam senarai nombor telefon, katakan anda ingin mencari nombor yang tidak mempunyai kod negara. Perlu diingat bahawa mana-mana kod antarabangsa termasuk tanda +, anda boleh menggunakan kelas aksara [^\+] untuk mencari rentetan yang tidak mengandungi tanda tambah. Adalah penting untuk menyedari bahawa ungkapan di atas sepadan dengan mana-mana aksara tunggal yang bukan +. Oleh kerana nombor telefon boleh berada di mana-mana dalam rentetan, tidak semestinya pada permulaannya, pengkuantiti * ditambah untuk menyemak setiap aksara berikutnya. Mula ^ dan akhir $ sauh memastikan bahawa keseluruhan rentetan diproses. Hasilnya, kami mendapat ungkapan biasa di bawah yang mengatakan "tidak sepadan dengan aksara + dalam mana-mana kedudukan dalam rentetan".
Corak :^[^\+]*$
=RegExpMatch(A5, "^[^\+]*$")
Regex untuk TIDAK sepadan dengan rentetan
Walaupun tiada sintaks ungkapan biasa khas untuk tidak sepadan dengan rentetan tertentu, anda boleh mencontohi tingkah laku ini dengan menggunakan pandangan negatif ke hadapan.
Andaikata anda ingin mencari rentetan yang tidak mengandungi perkataan "lemon". Ungkapan biasa ini akan berfungsi:
Corak : ^((?!lemon).)*$
Jelas sekali, beberapa penjelasan diperlukan di sini. Pandangan negatif (?!lemon) melihat ke kanan untuk melihat jika tiada perkataan "lemon" di hadapan. Jika "lemon" tiada, maka titik itu sepadan dengan mana-mana aksara kecuali pemisah baris. Ungkapan di atas melakukan hanya satu semakan dan pengkuantiti * mengulanginya sifar atau lebih kali, dari permulaan rentetan yang dilabuhkan oleh ^ hingga penghujung rentetan yang dilabuhkan oleh $.
Untuk mengabaikan huruf besar kecil, kami menetapkan argumen ke-3 kepada FALSE untuk menjadikan fungsi kami tidak peka huruf besar-besaran:
=RegExpMatch(A5, $A$2, FALSE)
Petua dan nota:
Padanan tidak sensitif huruf besar
Dalam ungkapan biasa klasik, terdapat corak khas untuk padanan tidak sensitif huruf besar/kecil (?i), yang tidak disokong dalam VBA RegExp. Untuk mengatasi had ini, fungsi tersuai kami menerima hujah pilihan ke-3 bernama match_case . Untuk melakukan pemadanan tidak sensitif huruf besar-besaran, hanya tetapkan pada FALSE.
Katakanlah anda ingin mengenal pasti tarikh seperti 1-Mac-22 atau 01-MAR-2022. Untuk memadankan format dd-mmm-yyyy dan d-mmm-yyy , kami menggunakan ungkapan biasa berikut.
Corak : \b\d{1,2}-(Jandigit di mana-mana dalam rentetan termasuk nombor 10 digit atau 100 digit. Jika ini bukan yang anda cari, letakkan perkataan sempadan \b pada kedua-dua belah pihak.
Corak : \b\d{7}\b
=RegExpMatch(A5:A9, "\b\d{7}\b")
Regex untuk memadankan nombor telefon
Memandangkan nombor telefon boleh ditulis dalam pelbagai format, pemadanannya memerlukan ungkapan biasa yang lebih canggih.
Dalam set data di bawah, kami akan mencari nombor 10 digit yang mempunyai 3 digit dalam 2 kumpulan pertama dan 4 digit dalam kumpulan terakhir. Kumpulan boleh diasingkan dengan noktah, sempang atau ruang. Kumpulan pertama mungkin atau mungkin tidak disertakan dalam kurungan.
Corak: (\(\d{3}\)