Regex untuk mengekstrak rentetan dalam Excel (satu atau semua padanan)

  • Berkongsi Ini
Michael Brown

Dalam tutorial ini, anda akan belajar cara menggunakan ungkapan biasa dalam Excel untuk mencari dan mengekstrak subrentetan yang sepadan dengan corak yang diberikan.

Microsoft Excel menyediakan beberapa fungsi untuk mengekstrak teks daripada sel. Fungsi tersebut boleh mengatasi kebanyakan cabaran pengekstrakan rentetan dalam lembaran kerja anda. Kebanyakan, tetapi tidak semua. Apabila fungsi Teks tersandung, ungkapan biasa datang untuk menyelamatkan. Tunggu… Excel tidak mempunyai fungsi RegEx! Benar, tiada fungsi terbina. Tetapi tiada apa yang akan menghalang anda daripada menggunakan yang anda sendiri :)

    Fungsi Regex VBA Excel untuk mengekstrak rentetan

    Untuk menambah fungsi Ekstrak Regeks tersuai pada Excel anda, tampal kod berikut dalam editor VBA. Untuk mendayakan ungkapan biasa dalam VBA, kami menggunakan objek Microsoft RegExp terbina dalam.

    Public Function RegExpExtract(text As String , pattern As String , Optional instance_num As Integer = 0, Optional match_case As Boolean = True ) Dim text_matches() As String Dim matches_index As Integer On Error GoTo ErrHandl RegExpExtract = "" Set regex = CreateObject ( "VBScript.RegExp") regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case Kemudian regex. ignorecase = Palsu Lain regex.ignorecase = Tamat Benar Jika Set sepadan = regex. Laksanakan(teks) Jika 0 < padanan.Count Then If (0 = instance_num) Then ReDim text_matches(matches.Count - 1, 0) For match_index = 0 ToVBA RegExp, saya menggalakkan anda membaca bahagian seterusnya yang membincangkan fungsi Regex .NET yang lebih berkuasa.

    Fungsi Regex berasaskan .NET tersuai untuk mengekstrak teks dalam Excel

    Tidak seperti fungsi RegEx VBA yang boleh ditulis oleh mana-mana pengguna Excel, .NET RegEx ialah alam pembangun. Microsoft .NET Framework menyokong sintaks ungkapan biasa berciri penuh yang serasi dengan Perl 5. Artikel ini tidak akan mengajar anda cara menulis fungsi sedemikian (saya bukan seorang pengaturcara dan tidak mempunyai idea sedikit pun tentang cara melakukannya :)

    Empat fungsi berkuasa yang diproses oleh enjin .NET RegEx standard telah pun ditulis oleh pembangun kami dan disertakan dalam Ultimate Suite. Di bawah, kami akan menunjukkan beberapa kegunaan praktikal bagi fungsi yang direka khas untuk mengekstrak teks dalam Excel.

    Petua. Untuk maklumat tentang sintaks .NET Regex, sila rujuk kepada .NET Regular Expression Language.

    Cara mengekstrak sengatan dalam Excel menggunakan ungkapan biasa

    Dengan mengandaikan anda telah memasang versi terkini Ultimate Suite, mengekstrak teks menggunakan ungkapan biasa bermuara kepada dua langkah ini:

    1. Pada tab Data Ablebits , dalam kumpulan Teks , klik Alat Regex .
    2. Pada anak tetingkap Alat Regex , pilih data sumber, masukkan corak Regex anda dan pilih pilihan Ekstrak . Untuk mendapatkan hasil sebagai fungsi tersuai, bukan nilai, pilih semak Sisipkan sebagai formula kotak. Apabila selesai, klik butang Ekstrak .

    Hasilnya akan muncul dalam lajur baharu di sebelah kanan data asal anda:

    Sintaks AblebitsRegexExtract

    Fungsi tersuai kami mempunyai sintaks berikut:

    AblebitsRegexExtract(reference, regular_expression)

    Di mana:

    • Rujukan (diperlukan) - rujukan kepada sel yang mengandungi rentetan sumber.
    • Regular_expression (diperlukan) - corak regex untuk dipadankan.

    Nota penting! Fungsi ini hanya berfungsi pada mesin yang dipasang Ultimate Suite for Excel.

    Nota penggunaan

    Untuk menjadikan lengkung pembelajaran anda lebih lancar dan pengalaman anda lebih menyeronokkan, sila beri perhatian kepada perkara ini:

    1. Untuk mencipta formula, anda boleh menggunakan Regex Tools atau dialog Insert function Excel atau taip nama fungsi penuh dalam sel. Setelah formula dimasukkan, anda boleh mengurusnya (edit, salin atau alih) seperti mana-mana formula asli.
    2. Corak yang anda masukkan pada anak tetingkap Regex Tools pergi ke argumen ke-2. Ia juga mungkin untuk menyimpan ungkapan biasa dalam sel yang berasingan. Dalam kes ini, hanya gunakan rujukan sel untuk hujah ke-2.
    3. Fungsi mengekstrak padanan pertama yang ditemui .
    4. Secara lalai, fungsinya ialah kes -sensitif . Untuk padanan tidak sensitif huruf besar-besaran, gunakan corak (?i).
    5. Jika padanan tidak ditemui, ralat #N/A ialahdikembalikan.

    Regex untuk mengekstrak rentetan antara dua aksara

    Untuk mendapatkan teks antara dua aksara, anda boleh menggunakan sama ada kumpulan menangkap atau melihat sekeliling.

    Mari kita katakan anda sedang mencari untuk mengekstrak teks antara kurungan. Kumpulan penangkapan ialah cara paling mudah.

    Pola 1 : \[(.*?)\]

    Dengan pandangan positif ke belakang dan ke hadapan, hasilnya akan betul-betul sama.

    Pola 2 : (?<=\[)(.*?)(?=\])

    Sila ambil perhatian bahawa kumpulan penangkap kami (.*?) melakukan carian malas untuk teks antara dua kurungan - dari yang pertama [ hingga yang pertama ]. Kumpulan penangkap tanpa tanda soal (.*) akan melakukan carian tamak dan menangkap segala-galanya daripada yang pertama [ hingga yang terakhir ].

    Dengan corak dalam A2, formula berjalan seperti berikut:

    =AblebitsRegexExtract(A5, $A$2)

    Cara untuk mendapatkan semua padanan

    Seperti yang telah disebutkan, fungsi AblebitsRegexExtract hanya boleh mengekstrak satu padanan. Untuk mendapatkan semua padanan, anda boleh menggunakan fungsi VBA yang telah kami bincangkan sebelum ini. Walau bagaimanapun, terdapat satu kaveat - VBA RegExp tidak menyokong menangkap kumpulan, jadi corak di atas akan mengembalikan aksara "sempadan" juga, kurungan dalam kes kami.

    =TEXTJOIN(" ", TRUE, RegExpExtract(A5, $A$2))

    Untuk menyingkirkan daripada kurungan, GANTIKAN dengan rentetan kosong ("") menggunakan formula ini:

    =SUBSTITUTE(SUBSTITUTE(TEXTJOIN(", ", TRUE, RegExpExtract(A5, $A$2)), "]", ""),"[","")

    Untuk kebolehbacaan yang lebih baik, kami menggunakan koma untuk pembatas.

    Regex untuk mengekstrak teks antara dua rentetan

    Pendekatan yang telah kami usahakantafsirkannya secara literal).

  • (?:[A-Za-z\d\-\.]{2,255}\.)? - kumpulan tidak menangkap untuk mengenal pasti domain peringkat ketiga, peringkat keempat, dsb., jika ada ( mudah alih dalam URL sampel kami). Dalam corak pertama, ia diletakkan dalam kumpulan penangkap yang lebih besar untuk memasukkan semua subdomain sedemikian ke dalam pengekstrakan. Subdomain boleh terdiri daripada 2 hingga 255 aksara, maka pengkuantiti {2,255}.
  • ([A-Za-z\d\-]{1,63}\.[A-Za-z] {2,24}) - menangkap kumpulan untuk mengekstrak domain peringkat kedua ( ablebits ) dan domain peringkat atas ( com ). Panjang maksimum domain peringkat kedua ialah 63 aksara. Domain peringkat atas terpanjang yang wujud pada masa ini mengandungi 24 aksara.
  • Bergantung pada ungkapan biasa yang dimasukkan dalam A2, formula di bawah akan menghasilkan hasil yang berbeza:

    =AblebitsRegexExtract(A5, $A$2)

    Regex untuk mengekstrak nama domain penuh dengan semua subdomain:

    Regex untuk mengekstrak domain peringkat kedua tanpa subdomain:

    Begitulah cara mengekstrak bahagian teks dalam Excel menggunakan ungkapan biasa. Saya mengucapkan terima kasih kerana membaca dan berharap dapat berjumpa anda di blog kami minggu depan!

    Muat turun yang tersedia

    Contoh Ekstrak Regex Excel (fail.xlsm)

    Versi percubaan Suite Ultimate (fail .exe)

    \b(0?[0-9]matches.Count - 1 text_matches(matches_index, 0) = matches.Item(matches_index) Next matches_index RegExpExtract = text_matches Lain RegExpExtract = padanan.Item(instance_num - 1) Tamat Jika Tamat Jika Keluar Fungsi ErrHandl: RegVluexlErr Function = CVErr() EndExtract

    Jika anda mempunyai sedikit pengalaman dengan VBA, panduan pengguna langkah demi langkah mungkin berguna: Cara memasukkan kod VBA dalam Excel.

    Nota. Untuk fungsi berfungsi, pastikan anda menyimpan fail anda sebagai buku kerja yang didayakan makro (.xlsm).

    Sintaks RegExpExtract

    Fungsi RegExpExtract mencari rentetan input untuk nilai yang sepadan dengan ungkapan biasa dan mengekstrak satu atau semua padanan.

    Fungsi ini mempunyai sintaks berikut :

    RegExpExtract(teks, corak, [instance_num], [match_case])

    Di mana:

    • Teks (diperlukan) - rentetan teks untuk dicari.
    • Corak (diperlukan) - ungkapan biasa untuk dipadankan. Apabila dibekalkan terus dalam formula, corak hendaklah disertakan dalam tanda petikan berganda.
    • Instance_num (pilihan) - nombor siri yang menunjukkan contoh yang hendak diekstrak. Jika ditinggalkan, mengembalikan semua padanan yang ditemui (lalai).
    • Match_case (pilihan) - mentakrifkan sama ada untuk memadankan atau mengabaikan huruf besar. Jika BENAR atau ditinggalkan (lalai), padanan sensitif huruf besar-besaran dilakukan; jika FALSE - tidak peka huruf besar dan kecil.

    Fungsi berfungsi dalam semua versi Excel 365, Excel 2021, Excel2019, Excel 2016, Excel 2013 dan Excel 2010.

    4 perkara yang perlu anda ketahui tentang RegExpExtract

    Untuk menggunakan fungsi dalam Excel anda dengan berkesan, terdapat beberapa perkara penting yang perlu diberi perhatian:

    1. Secara lalai, fungsi mengembalikan semua padanan yang ditemui ke dalam sel jiran seperti ditunjukkan dalam contoh ini. Untuk mendapatkan kejadian tertentu, berikan nombor yang sepadan dengan argumen instance_num .
    2. Secara lalai, fungsi ini adalah sensitif huruf besar-kecil . Untuk padanan tidak sensitif huruf besar-besaran, tetapkan argumen match_case kepada FALSE. Oleh kerana pengehadan VBA, binaan tidak peka huruf besar-kecil (?i) tidak akan berfungsi.
    3. Jika corak yang sah tidak ditemui , fungsi tidak mengembalikan apa-apa (rentetan kosong).
    4. Jika corak tidak sah , satu #VALUE! ralat berlaku.

    Sebelum anda mula menggunakan fungsi tersuai ini dalam lembaran kerja anda, anda perlu memahami kemampuannya, bukan? Contoh di bawah merangkumi beberapa kes penggunaan biasa dan terangkan sebab tingkah laku mungkin berbeza dalam Dynamic Array Excel (Microsoft 365 dan Excel 2021) dan Excel tradisional (versi 2019 dan lebih lama).

    Nota. Contoh regex keluar ditulis untuk set data mudah dongeng. Kami tidak dapat menjamin ia akan berfungsi dengan sempurna dalam lembaran kerja sebenar anda. Mereka yang mempunyai pengalaman dengan regex akan bersetuju bahawa menulis ungkapan biasa ialah jalan yang tidak berkesudahan untuk kesempurnaan - hampir selalu ada cara untuk membuatia lebih elegan atau mampu mengendalikan julat data input yang lebih luas.

    Regex untuk mengekstrak nombor daripada rentetan

    Mengikuti maksim asas pengajaran "dari mudah kepada kompleks", kita akan mulakan dengan kes yang sangat mudah: mengekstrak nombor daripada rentetan.

    The perkara pertama untuk anda tentukan ialah nombor yang hendak diambil: pertama, terakhir, kejadian khusus atau semua nombor.

    Ekstrak nombor pertama

    Ini semudah yang boleh diperolehi oleh regex. Memandangkan \d bermaksud sebarang digit dari 0 hingga 9 dan + bermaksud satu kali atau lebih, ungkapan biasa kami mengambil bentuk ini:

    Corak : \d+

    Tetapkan instance_num hingga 1 dan anda akan mendapat hasil yang diingini:

    =RegExpExtract(A5, "\d+", 1)

    Di mana A5 ialah rentetan asal.

    Untuk kemudahan, anda boleh memasukkan corak dalam sel pratakrif ($A$2 ) dan kunci alamatnya dengan tanda $:

    =RegExpExtract(A5, $A$2, 1)

    Dapatkan nombor terakhir

    Untuk mengekstrak nombor terakhir dalam rentetan , berikut ialah corak untuk digunakan:

    Corak : (\d+)(?!.*\d)

    Diterjemahkan ke dalam bahasa manusia , ia berkata: cari nombor yang tidak diikuti (di mana-mana, bukan serta-merta) oleh mana-mana nombor lain. Untuk menyatakan ini, kami menggunakan pandangan negatif (?!.*\d), yang bermaksud bahawa di sebelah kanan corak tidak sepatutnya terdapat digit lain (\d) tidak kira berapa banyak aksara lain di hadapannya.

    =RegExpExtract(A5, "(\d+)(?!.*\d)")

    Petua:

    • Untuk mendapatkan kejadian khusus , gunakan \d+ untuk corak dan siri yang sesuainombor untuk instance_num .
    • Formula untuk mengekstrak semua nombor dibincangkan dalam contoh seterusnya.

    Regex untuk mengekstrak semua padanan

    Menolak contoh kami lebih jauh, katakan anda ingin mendapatkan semua nombor daripada rentetan, bukan hanya satu.

    Seperti yang anda ingat, bilangan padanan yang diekstrak dikawal oleh pilihan instance_num argumen. Lalai ialah semua padanan, jadi anda hanya tinggalkan parameter ini:

    =RegExpExtract(A2, "\d+")

    Formula berfungsi dengan baik untuk satu sel, tetapi tingkah laku berbeza dalam Dynamic Array Excel dan versi bukan dinamik.

    Excel 365 dan Excel 2021

    Disebabkan sokongan untuk tatasusunan dinamik, formula biasa secara automatik tumpah ke dalam seberapa banyak sel yang diperlukan untuk memaparkan semua hasil yang dikira. Dari segi Excel, ini dipanggil julat tertumpah:

    Excel 2019 dan lebih rendah

    Dalam Excel pra-dinamik, formula di atas akan mengembalikan hanya satu padanan. Untuk mendapatkan berbilang padanan, anda perlu menjadikannya formula tatasusunan. Untuk ini, pilih julat sel, taipkan formula dan tekan Ctrl + Shift + Enter untuk melengkapkannya.

    Kelemahan pendekatan ini ialah sekumpulan ralat #N/A yang muncul dalam "sel tambahan" . Malangnya, tiada apa yang boleh dilakukan mengenainya (IFERROR atau IFNA tidak boleh membetulkannya, malangnya).

    Ekstrak semua padanan dalam satu sel

    Apabila memproses lajur data, pendekatan di atas jelas tidak akan berfungsi. Dalam kes ini, penyelesaian yang idealakan mengembalikan semua padanan dalam satu sel. Untuk melakukannya, sajikan hasil RegExpExtract kepada fungsi TEXTJOIN dan pisahkan dengan mana-mana pembatas yang anda suka, sebutkan koma dan ruang:

    =TEXTJOIN(", ", TRUE, RegExpExtract(A5, "\d+"))

    Nota. Oleh kerana fungsi TEXTJOIN hanya tersedia dalam Excel untuk Microsoft 365, Excel 2021 dan Excel 2019, formula tidak akan berfungsi dalam versi lama.

    Regex untuk mengekstrak teks daripada rentetan

    Mengekstrak teks daripada rentetan alfanumerik adalah tugas yang agak mencabar dalam Excel. Dengan regex, ia menjadi semudah pai. Hanya gunakan kelas yang dinafikan untuk memadankan semua yang bukan digit.

    Corak : [^\d]+

    Untuk mendapatkan subrentetan dalam sel individu (julat tumpahan) , formulanya ialah:

    =RegExpExtract(A5, "[^\d]+")

    Untuk mengeluarkan semua padanan ke dalam satu sel, sarangkan fungsi RegExpExtract dalam TEXTJOIN seperti ini:

    =TEXTJOIN("", TRUE, RegExpExtract(A5, "[^\d]+"))

    Regex ke ekstrak alamat e-mel daripada rentetan

    Untuk mengeluarkan alamat e-mel daripada rentetan yang mengandungi banyak maklumat berbeza, tulis ungkapan biasa yang mereplikasi struktur alamat e-mel.

    Corak : [\w\.\-]+@[A-Za-z0-9\.\-]+\.[A-Za-z]{2,24}

    Memecahkan regex ini , inilah yang kami dapat:

    • [\w\.\-]+ ialah nama pengguna yang mungkin termasuk 1 atau lebih aksara abjad angka, garis bawah, titik dan sempang.
    • @ simbol
    • [A-Za-z0-9\.\-]+ ialah nama domain yang terdiri daripada: huruf besar dan huruf kecil, digit, sempang dan titik (sekiranyadaripada subdomain). Garis bawah tidak dibenarkan di sini, oleh itu 3 set aksara yang berbeza (seperti A-Z a-z dan 0-9) digunakan dan bukannya \w yang sepadan dengan mana-mana huruf, digit atau garis bawah.
    • \.[A-Za-z ]{2,24} ialah domain peringkat atasan. Terdiri daripada titik diikuti dengan huruf besar dan huruf kecil. Kebanyakan domain peringkat atas mempunyai panjang 3 huruf (cth. .com .org, .edu, dll.), tetapi secara teori ia boleh mengandungi daripada 2 hingga 24 huruf (TLD berdaftar paling lama).

    Dengan mengandaikan rentetan dalam A5 dan corak dalam A2, formula untuk mengekstrak alamat e-mel ialah:

    =RegExpExtract(A5, $A$2)

    Regex untuk mengekstrak domain daripada e-mel

    Apabila ia datang untuk mengekstrak domain e-mel, pemikiran pertama yang terlintas di fikiran ialah menggunakan kumpulan penangkapan untuk mencari teks yang serta-merta mengikuti aksara @.

    Corak : @([A-Za-z0 -9\.\-]+\.[A-Za-z]{2,24})

    Hidangkannya ke fungsi RegExp kami:

    =RegExpExtract(A5, "@([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})")

    Dan anda akan mendapat hasil ini:

    Dengan ungkapan biasa klasik, apa-apa sahaja di luar kumpulan penangkapan tidak termasuk dalam pengekstrakan. Tiada siapa yang tahu mengapa VBA RegEx berfungsi secara berbeza dan menangkap "@" juga. Untuk menyingkirkannya, anda boleh mengalih keluar aksara pertama daripada hasil carian dengan menggantikannya dengan rentetan kosong.

    =REPLACE(RegExpExtract(A5, "@([a-z\d][a-z\d\-\.]*\.[a-z]{2,})", 1, FALSE), 1, 1, "")

    Ungkapan biasa untuk mengekstrak nombor telefon

    Nombor telefon boleh ditulis dalam pelbagai cara, itulah sebabnya hampir mustahil untuk menghasilkan penyelesaian yang berfungsi di bawah semua(\d{4}daripada rentetan

    Ungkapan biasa untuk mengekstrak tarikh bergantung pada format tarikh muncul dalam rentetan. Contohnya:

    Untuk mengekstrak tarikh seperti 1/1/21 atau 01/01/2021, regex ialah: \d{1,2}\/\d{1,2}\/(\d {4}keadaan. Namun begitu, anda boleh menulis semua format yang digunakan dalam set data anda dan cuba memadankannya.

    Untuk contoh ini, kami akan mencipta regex yang akan mengekstrak nombor telefon dalam mana-mana format ini:

    (123) 345-6789

    (123) 345 6789

    (123)3456789

    123- 345-6789

    123.345.6789

    123 345 6789

    1233456789

    Corak : \(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b

    • Bahagian pertama \(?\d{3} sepadan dengan sifar atau satu kurungan bukaan diikuti dengan tiga digit d{3}.
    • Bahagian [-\. \)]* bermaksud sebarang aksara dalam kurungan segi empat sama yang muncul 0 atau lebih kali: sempang, noktah, ruang atau kurungan penutup.
    • Seterusnya, kita mempunyai tiga digit sekali lagi d{3} diikuti dengan sebarang sempang, noktah atau ruang [-\. ]? muncul 0 atau 1 kali.
    • Selepas itu, terdapat sekumpulan empat digit \d{4}.
    • Akhir sekali, terdapat sempadan perkataan \b yang mentakrifkan bahawa nombor telefon kita cari tidak boleh menjadi sebahagian daripada nombor yang lebih besar.

    Formula lengkap mengambil bentuk ini:

    =RegExpExtract(A5, "\(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b")

    Sila ambil perhatian bahawa regex di atas mungkin mengembalikan beberapa hasil positif palsu seperti 123) 456 7899 atau (123 456 7899. Versi di bawah membetulkan isu ini. Walau bagaimanapun, sintaks ini hanya berfungsi dalam fungsi RegExp VBA, bukan dalam ungkapan biasa klasik.

    Pola : (\(\d{3}\)keluar untuk mengeluarkan teks antara dua aksara juga akan berfungsi untuk mengekstrak teks antara dua rentetan.

    Sebagai contoh, untuk mendapatkan segala-galanya antara "ujian 1" dan "ujian 2", gunakan ungkapan biasa berikut.

    Corak : ujian 1(.*?)test 2

    Formula lengkap ialah:

    =AblebitsRegexExtract(A5, "test 1(.*?)test 2")

    Regex untuk mengekstrak domain daripada URL

    Walaupun dengan ungkapan biasa, mengekstrak nama domain daripada URL bukanlah tugas yang remeh. Elemen utama yang melakukan muslihat adalah kumpulan yang tidak menangkap. Bergantung pada matlamat utama anda, pilih salah satu daripada regeks di bawah.

    Untuk mendapatkan nama domain penuh termasuk subdomain

    Corak : (?: https?\:

    Michael Brown ialah peminat teknologi yang berdedikasi dengan semangat untuk memudahkan proses kompleks menggunakan alat perisian. Dengan lebih sedekad pengalaman dalam industri teknologi, beliau telah mengasah kemahirannya dalam Microsoft Excel dan Outlook, serta Helaian Google dan Dokumen. Blog Michael berdedikasi untuk berkongsi pengetahuan dan kepakarannya dengan orang lain, menyediakan petua dan tutorial yang mudah diikuti untuk meningkatkan produktiviti dan kecekapan. Sama ada anda seorang profesional berpengalaman atau pemula, blog Michael menawarkan pandangan berharga dan nasihat praktikal untuk memanfaatkan sepenuhnya alatan perisian penting ini.