Excel Regex: ujemanje nizov z uporabo regularnih izrazov

  • Deliti To
Michael Brown

V tem učbeniku si bomo podrobno ogledali, kako uporabiti regex za ujemanje nizov v Excelu.

Ko morate v območju celic najti določeno vrednost, uporabite funkcijo MATCH ali XMATCH. Pri iskanju določenega niza v celici sta priročni funkciji FIND in SEARCH. In kako ugotovite, ali celica vsebuje podatke, ki ustrezajo določenemu vzorcu? Očitno z uporabo regularnih izrazov. Toda Excel ne podpira regeksov! Brez skrbi, prisilili ga bomo v to :)

    Funkcija Excel VBA Regex za ujemanje nizov

    Kot je razvidno iz naslova, morate za uporabo regularnih izrazov v Excelu ustvariti lastno funkcijo. Na srečo ima Excelov program VBA vgrajeno funkcijo RegExp ki ga lahko uporabite v kodi, kot je prikazano spodaj:

    Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'polje za shranjevanje rezultatov Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'indeks trenutne vrstice v izvornem območju, indeks trenutnega stolpca v izvornem območju, število vrstic, število stolpcev 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 Do cntInputCols arRes(iInputCurRow, iInputCurCol) = regex.Test(input_range.Cells(iInputCurRow, iInputCurCol).Value) Next Next Next RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) End Function

    kodo prilepite v urejevalnik VBA in vaš novi RegExpMatch Če nimate veliko izkušenj z VBA, vam bo morda v pomoč ta priročnik: Kako vstaviti kodo VBA v Excel.

    Opomba: Ko vstavite kodo, ne pozabite shraniti datoteke kot Delovni zvezek z omogočenimi makri (.xlsm).

    Skladnja RegExpMatch

    Spletna stran RegExpMatch funkcija preveri, ali se kateri koli del izvornega niza ujema z regularnim izrazom. Rezultat je logična vrednost: TRUE, če je bilo najdeno vsaj eno ujemanje, in FALSE v nasprotnem primeru.

    Naša funkcija po meri ima tri argumente - prva dva sta obvezna, zadnji pa je neobvezen:

    RegExpMatch(besedilo, vzorec, [match_case])

    Kje:

    • Besedilo (obvezno) - eden ali več nizov za iskanje. Lahko se navede kot referenca na celico ali območje.
    • Vzorec (obvezno) - regularni izraz za ujemanje. Če je vzorec neposredno v formuli, mora biti zaprt v dvojne narekovaje.
    • Match_case (neobvezno) - določa vrsto ujemanja. Če je to TRUE ali izpuščeno (privzeto), se izvede ujemanje, občutljivo na velikost črk; če je to FALSE, se izvede ujemanje, ki ni občutljivo na velikost črk.

    Funkcija deluje v vseh različicah programov Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 in Excel 2010.

    3 stvari, ki jih morate vedeti o RegExpMatch

    Preden se lotimo praktičnih izračunov, upoštevajte naslednje točke, ki pojasnjujejo nekatere tehnične podrobnosti:

    1. Funkcija lahko obdela posamezna celica ali obseg celic V slednjem primeru se rezultati vrnejo v sosednjih celicah v obliki dinamičnega polja ali razpona, kot je prikazano v tem primeru.
    2. Privzeto je funkcija , ki upošteva velike in male črke. Če ne želite upoštevati velikosti črk besedila, nastavite match_case Zaradi omejitev VBA Regexp vzorec (?i), ki ne razlikuje velikih in malih črk, ni podprt.
    3. Če veljavni vzorec ni najden, funkcija vrne FALSE; če je vzorec vzorec je neveljaven. , se pojavi napaka #VALUE!.

    V nadaljevanju najdete nekaj primerov ujemanja regex, ki so bili ustvarjeni za predstavitvene namene. Ne moremo zagotoviti, da bodo naši vzorci brezhibno delovali s širšim naborom vhodnih podatkov v vaših resničnih delovnih listih. Pred uporabo v proizvodnji preverite in prilagodite naše vzorce glede na svoje potrebe.

    Kako uporabiti regex za ujemanje nizov v Excelu

    Kadar imajo vsi nizi, ki jih želite ujemati, enak vzorec, so regularni izrazi idealna rešitev.

    Recimo, da imate na voljo niz celic (A5:A9), ki vsebujejo različne podrobnosti o nekaterih predmetih. Želite vedeti, v katerih celicah so številke SKU. Ob predpostavki, da je vsaka SKU sestavljena iz dveh velikih črk, pomišljaja in treh številk, jih lahko primerjate z naslednjim izrazom.

    Vzorec : \b[A-Z]{2}-\d{3}\b

    Pri čemer [A-Z]{2} pomeni dve veliki črki od A do Ž, \d{3} pa tri števke od 0 do 9. Znak \b označuje mejo besed, kar pomeni, da je SKU ločena beseda in ne del večjega niza, kot je 23-MAR-2022.

    Z vzpostavljenim vzorcem lahko preidemo k pisanju formule. Uporaba funkcije po meri se v bistvu ne razlikuje od domače funkcije. Takoj ko začnete pisati formulo, se bo ime funkcije pojavilo na seznamu, ki ga predlaga Excelova funkcija Samodejno dokončanje. Vendar je v Excelu z dinamičnim poljem (Microsoft 365 in Excel 2021) in tradicionalnem Excelu (2019 in starejše različice) nekaj odtenkov.

    Ujemanje niza v eni celici

    Če želite ujemati niz v posamezni celici, se v prvem argumentu sklicujte na to celico. Drugi argument naj bi vseboval regularni izraz.

    =RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")

    Vzorec je lahko shranjen tudi v vnaprej določeni celici, ki je zaklenjena z absolutno referenco ($A$2):

    =RegExpMatch(A5, $A$2)

    Po vnosu formule v prvo celico jo lahko povlečete navzdol v vse druge vrstice.

    Ta metoda se odlično obnese v vse različice programa Excel .

    Ujemanje nizov v več celicah hkrati

    Če želite z eno formulo ujemati več nizov, v prvi argument vključite sklic na območje:

    =RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")

    Na spletnem mestu Excel 365 in . Excel 2021 ki podpirajo dinamične nize, deluje na ta način - v prvo celico vnesete formulo, pritisnete Enter , formula pa se samodejno prelije v spodnje celice.

    Na spletnem mestu Excel 2019 in prej deluje le kot običajna formula CSE, ki se vnese v niz celic in zaključi s pritiskom tipk Ctrl + Shift + Enter.

    Regex za ujemanje s številko

    Za ujemanje katere koli posamezne številke od 0 do 9 uporabite \d Glede na vašo konkretno nalogo dodajte ustrezen kvantifikator ali ustvarite bolj zapleten vzorec.

    Regex za ujemanje s poljubnim številom

    Če želite ujemati poljubno dolga števila, takoj za znakom /d vstavite kvantifikator +, ki pravi, da je treba iskati števila, ki vsebujejo 1 ali več številk.

    Vzorec : \d+

    =RegExpMatch(A5:A9, "\d+")

    Regex za ujemanje s številom določene dolžine

    Če je vaš cilj ujemanje številčnih vrednosti, ki vsebujejo določeno število številk, uporabite \d skupaj z ustreznim kvantifikatorjem.

    Če želite na primer ujemati številke računov, sestavljene iz natanko 7 številk, uporabite \d{7}. Vendar ne pozabite, da se bo ujemal s 7 številkami kjer koli v nizu, vključno z 10-mestno ali 100-mestno številko. Če to ni tisto, kar iščete, na obe strani postavite besedno mejo \b.

    Vzorec : \b\d{7}\b

    =RegExpMatch(A5:A9, "\b\d{7}\b")

    Regex za ujemanje telefonskih številk

    Ker so lahko telefonske številke zapisane v različnih oblikah, je za njihovo ujemanje potreben bolj zapleten regularni izraz.

    V spodnjem naboru podatkov bomo iskali desetmestna števila, ki imajo v prvih dveh skupinah tri števke, v zadnji skupini pa štiri. Skupine so lahko ločene s piko, pomišljajem ali presledkom. Prva skupina je lahko v oklepaju, lahko pa tudi ne.

    Vzorec: (\(\d{3}\)

    Če razčlenimo ta regularni izraz, dobimo naslednje rezultate:

    • Prvi del (\(\d{3}\)
    • Del [-\.\s]? pomeni 0 ali 1 pojav kateregakoli znaka v oglatih oklepajih: pomišljaja, pike ali belega presledka.
    • Sledi še ena skupina treh številk d{3}, ki jim sledi katerikoli pomišljaj, pika ali beli presledek [\-\.\s]?, ki se pojavi 0- ali 1-krat.
    • Zadnji skupini štirih številk \d{4} sledi besedna meja \b, ki jasno pove, da telefonska številka ne more biti del večje številke.

    Z izvirnim nizom v A5 in regularnim izrazom v A2 je formula takšna:

    =RegExpMatch(A5, $A$2)

    ... in deluje točno tako, kot je bilo pričakovano:

    Opombe:

    • Mednarodne kode niso preverjene, zato so lahko prisotne ali pa tudi ne.
    • V regularnih izrazih \s pomeni kateri koli bel znak, kot so presledek, tabulator, povratni znak ali nova vrstica. Če želite dovoliti samo presledke, uporabite [-\. ] namesto [-\.\s].
    • Regex za NE ujemanje znaka

      Za iskanje nizov, ki NE vsebujejo določenega znaka, lahko uporabite razrede zanikanih znakov [^ ], ki se ujemajo z vsem, kar NI v oklepaju. Na primer:

      • [^13] se ujema z vsemi posameznimi znaki, ki niso 1 ali 3.
      • [^1-3] se ujema z vsemi posameznimi znaki, ki niso 1, 2 ali 3 (tj. vse številke od 1 do 3).

      V seznamu telefonskih številk želite poiskati tiste, ki nimajo kode države. Ker vsaka mednarodna koda vključuje znak +, lahko uporabite razred znakov [^\+] za iskanje nizov, ki ne vsebujejo znaka plus. Pomembno je vedeti, da zgornji izraz ustreza vsakemu posameznemu znaku, ki ni +. Ker je lahko telefonska številka kjer koli v nizu, nenujno na samem začetku je dodan kvantifikator *, ki preveri vsak naslednji znak. začetno ^ in končno $ sidrišče zagotavljata obdelavo celotnega niza. Tako dobimo spodnji regularni izraz, ki pravi "ne ujemaj znaka + na nobenem mestu v nizu".

      Vzorec : ^[^\+]*$

      =RegExpMatch(A5, "^[^\+]*$")

      Regex, ki se NE ujema z nizom

      Čeprav ni posebne sintakse regularnega izraza za neujemanje določenega niza, lahko to vedenje posnemate z uporabo negativnega lookaheada.

      Predpostavimo, da želite poiskati nize, ki ne vsebujejo besedo "limone". Ta regularni izraz bo deloval odlično:

      Vzorec : ^(((?!limone).)*$

      Očitno je tu potrebno nekaj razlage. Negativni lookahead (?!lemons) pogleda v desno, da bi preveril, ali pred njim ni besede "lemons". Če besede "lemons" ni, potem pika ustreza kateremu koli znaku, razen preloma vrstice. Zgornji izraz opravi samo eno preverjanje, kvantifikator * pa ga ponovi ničkrat ali več, od začetka niza, zasidranega z ^, do konca niza, zasidranega z$.

      Če želimo zanemariti velikost črk besedila, nastavimo 3. argument na FALSE, tako da naša funkcija ni občutljiva na velikost črk:

      =RegExpMatch(A5, $A$2, FALSE)

      Nasveti in opombe:

      • Zgornji regex deluje le za enovrstični V primeru nizov z več vrsticami se znaka ^ in $ ujemata z začetkom in koncem vsake vrstice namesto z začetkom in koncem vhodnega niza, zato regeks išče samo v prvi vrstici.
      • Ujemanje nizov, ki ne zaženite z določenim besedilom , uporabite regularni izraz, kot je ^(?!citron).*$
      • Ujemanje nizov, ki se ne končajo z določenim besedilom , vključite sidro končnega niza v iskalni vzorec: ^(((?!citron$).)*$

      Ujemanje brez upoštevanja velikosti črk

      V klasičnih regularnih izrazih obstaja poseben vzorec za ujemanje brez upoštevanja velikosti črk (?i), ki v VBA RegExp ni podprt. Da bi to omejitev odpravili, naša funkcija po meri sprejme 3. neobvezni argument z imenom match_case . Če želite izvajati ujemanje brez upoštevanja velikosti črk, jo preprosto nastavite na FALSE.

      Recimo, da želite določiti datume, kot sta 1. marec 22 ali 01. marec 2022. dd-mmm-yyyy in . d-mmm-yy formatov uporabljamo naslednji regularni izraz.

      Vzorec : \b\d{1,2}-(Jan

      Naš izraz išče skupino 1 ali 2 številk, ki jim sledi pomišljaj, nato pa katera koli kratica meseca, ločena z

      Zakaj ne uporabite preprostejšega vzorca, kot je \d{1,2}-[A-Za-z]{3}-\d{2,4}\b?

      Vnesite vzorec v A2 in dobili boste naslednjo formulo:

      =RegExpMatch(A5, $A$2, FALSE)

      Regex za ujemanje veljavnih e-poštnih naslovov

      Kot je splošno znano, je e-poštni naslov sestavljen iz štirih delov: uporabniškega imena, simbola @, imena domene (poštni strežnik) in domene najvišje ravni (kot so .com, .edu, .org itd.). Če želimo preveriti veljavnost e-poštnega naslova, moramo zgornjo strukturo ponoviti z uporabo regularnih izrazov.

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

      Da bi bolje razumeli, kaj se tu dogaja, si podrobneje oglejmo posamezne dele:

      • Uporabniško ime lahko vključuje črke, številke, podčrtaje, pike in pomišljaje. Če upoštevamo, da se \w ujema s katero koli črko, številko ali podčrtajem, dobimo naslednji regex: [\w\.\-]+
      • Ime domene lahko vključuje velike in male črke, številke, pomišljaje (vendar ne na prvem ali zadnjem mestu) in pike (v primeru poddomen). Ker podčrtaji niso dovoljeni, namesto \w uporabljamo 3 različne nabore znakov: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+
      • Domena najvišje ravni je sestavljen iz pike, ki ji sledijo velike in male črke. Vsebuje lahko od 2 do 24 črk (najdaljša trenutno obstoječa TLD): \.[A-Za-z]{2,24}

      Opomba: Vzorec predvideva, da ime domene vsebuje 2 ali več alfanumeričnih znakov.

      Z izvirnim besedilom v formatu A5 in vzorcem v formatu A5 je formula takšna:

      =RegExpMatch(A5, $A$2)

      Lahko pa uporabite preprostejši regularni izraz za preverjanje e-pošte z nizom znakov malih ali velikih črk:

      Vzorec : \b[\w\.\-]+@[a-z0-9]+[a-z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b

      V formuli pa ne smete razlikovati med malimi in velikimi črkami:

      =RegExpMatch(A5, $A$2, FALSE)

      Excelova formula IF z ujemajočim se regexom

      Ker se vgrajene funkcije in funkcije po meri dobro dopolnjujejo, vam nič ne preprečuje, da bi jih uporabili skupaj v eni sami formuli.

      Če želite nekaj vrniti ali izračunati, če se regularni izraz ujema, in nekaj drugega, če se ne ujema, vstavite funkcijo RegExpMatch po meri v logično besedilo IF:

      IF(RegExpMatch(...), [value_if_true], [value_if_false])

      Če na primer niz v A5 vsebuje veljaven e-poštni naslov, lahko vrnete "Da", sicer pa "Ne".

      =IF(RegExpMatch(A5, $A$2,), "Da", "Ne")

      Števec, če je regex skladen

      Ker izvorne funkcije programa Excel ne podpirajo regularnih izrazov, regexa ni mogoče vstaviti neposredno v funkcijo COUNTIS ali COUNTIFS. Na srečo lahko to funkcijo posnemate z uporabo naše funkcije po meri.

      Recimo, da ste uporabili regex za ujemanje telefonskih številk in rezultate izpisali v stolpec B. Če želite ugotoviti, koliko celic vsebuje telefonske številke, morate prešteti vrednosti TRUE v B5:B9. To lahko preprosto storite s standardno formulo COUNTIF:

      =COUNTIF(B5:B9, TRUE)

      Ne želite dodatnih stolpcev v delovnem listu? Ni problema. Ob upoštevanju, da lahko naša funkcija po meri obdela več celic hkrati in da lahko Excelova funkcija SUM sešteje vrednosti v polju, naredite naslednje:

      • RegExpMatch posreduje referenco na območje, tako da vrne polje vrednosti TRUE in FALSE.
      • Z dvojnim zanikanjem (--) spremenite logične vrednosti v enice in ničle.
      • Uporabite funkcijo SUM, da seštejete 1 in 0 v dobljenem polju.

      =SUM(--RegExpMatch(A5:A9, $A$2))

      Ujemanje regexa s paketom Ultimate Suite

      Uporabniki našega paketa Ultimate Suite lahko uporabljajo štiri zmogljive funkcije Regex, ne da bi v svoje delovne zvezke dodali kodo VBA, saj so med namestitvijo dodatka gladko vključene v Excel. Naše funkcije po meri obdeluje standardni motor RegEx .NET in podpirajo polno funkcionalne klasične regularne izraze.

      Kako uporabljati funkcijo RegexMatch po meri

      Če imate nameščeno najnovejšo različico paketa Ultimate Suite (2021.4 ali novejšo), lahko formulo Regex Match ustvarite v dveh preprostih korakih:

      1. Na Podatkovni zapisi o napravah Ablebits v zavihku Besedilo skupino, kliknite Orodja Regex .

    • Na Orodja Regex v podoknu naredite naslednje:
      • Izberite izvorne nize.
      • Vnesite vzorec.
      • Izberite Tekma možnost.
      • Če želite rezultate prikazati kot formule in ne kot vrednosti, izberite Vstavite kot formulo potrditveno polje.
      • Kliknite na Tekma gumb.

      Trenutek pozneje je AblebitsRegexMatch je vstavljena v nov stolpec na desni strani podatkov.

      Na spodnji sliki zaslona funkcija preveri, ali nizi v stolpcu A vsebujejo sedemmestne številke ali ne.

      Nasveti:

      • Funkcija je lahko vstavljen neposredno v celici prek standarda Funkcija vstavljanja v pogovornem oknu, kjer je razvrščena v kategorijo AblebitsUDFs .
      • Privzeto je regularni izraz dodan formuli, vendar ga lahko shranite tudi v ločeni celici. Za to uporabite le sklic na celico za 2. argument.
      • Privzeto je funkcija , ki upošteva velike in male črke. . Za ujemanje brez upoštevanja velikosti črk uporabite vzorec (?i).

      Za več informacij glejte funkcijo AblebitsRegexMatch.

      To je način ujemanja regularnih izrazov v Excelu. Zahvaljujem se vam za branje in se veselim, da se naslednji teden vidimo na našem blogu!

      Razpoložljivi prenosi

      Primeri ujemanja regeksov v programu Excel (.xlsm datoteka)

      Ultimate Suite 14-dnevna popolnoma funkcionalna različica (.exe datoteka)

    Michael Brown je predan tehnološki navdušenec s strastjo do poenostavljanja kompleksnih procesov z uporabo programskih orodij. Z več kot desetletnimi izkušnjami v tehnološki industriji je svoje veščine izpopolnil v Microsoft Excelu in Outlooku ter Google Preglednicah in Dokumentih. Michaelov blog je namenjen deljenju svojega znanja in strokovnega znanja z drugimi ter ponuja preproste nasvete in vadnice za izboljšanje produktivnosti in učinkovitosti. Ne glede na to, ali ste izkušen strokovnjak ali začetnik, Michaelov blog ponuja dragocene vpoglede in praktične nasvete, kako kar najbolje izkoristiti ta osnovna programska orodja.