Excel Regex: podudaranje nizova pomoću regularnih izraza

  • Podijeli Ovo
Michael Brown

U ovom vodiču detaljno ćemo pogledati kako koristiti regex za podudaranje nizova u Excelu.

Kada trebate pronaći određenu vrijednost u rasponu ćelija, upotrijebili biste funkciju MATCH ili XMATCH. Kada tražite određeni niz u ćeliji, korisne su funkcije FIND i SEARCH. I kako znati sadrži li ćelija informacije koje odgovaraju danom uzorku? Očito, korištenjem regularnih izraza. Ali izvan okvira Excel ne podržava regularne izraze! Bez brige, mi ćemo ga prisiliti :)

    Excel VBA Regex funkcija za podudaranje nizova

    Kao što je prilično jasno iz naslova, za korištenje regularnih izraza u Excelu morate izraditi vlastitu funkciju. Srećom, Excelov VBA ima ugrađeni objekt RegExp koji možete koristiti u svom kodu kao što je prikazano u nastavku:

    Public Function RegExpMatch(input_range As Range, pattern As String, Optional match_case As Boolean = True) As Variant Dim arRes() As Variant 'polje za pohranu rezultata Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'indeks trenutnog retka u izvornom rasponu, indeks trenutnog stupca u izvornom rasponu, broj redaka, broj stupci On Error GoTo ErrHandl RegExpMatch = arRes Postavi regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = uzorak regex.Global = True regex.MultiLine = True If True = match_case Then regex.ignorecase = False Else regex.ignorecase = True Krajizrazi.

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

    Da bismo bolje razumjeli što se ovdje događa, pogledajmo pobliže svaki dio :

    • Korisničko ime može sadržavati slova, brojke, podvlake, točke i crtice. Imajući na umu da \w odgovara bilo kojem slovu, znamenki ili podvlaci, dobivamo sljedeći regularni izraz: [\w\.\-]+
    • Naziv domene može uključivati ​​velika i mala slova, znamenke, crtice (ali ne na prvom ili zadnjem mjestu) i točke (u slučaju poddomena). Budući da podvlake nisu dopuštene, umjesto \w koristimo 3 različita skupa znakova: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
    • Domena najviše razine sastoji se od točke nakon koje slijede velika i mala slova. Može sadržavati od 2 do 24 slova (najduži TLD koji trenutno postoji): \.[A-Za-z]{2,24}

    Napomena. Uzorak pretpostavlja da naziv domene sadrži 2 ili više alfanumeričkih znakova.

    S izvornim tekstom u formatu A5 i uzorkom u formatu A5, formula ima ovaj oblik:

    =RegExpMatch(A5, $A$2)

    Možete upotrijebiti i jednostavniju regularnu izraz za provjeru valjanosti e-pošte sa skupom znakova malih ili velikih slova:

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

    Ali neka vaša formula ne razlikuje velika i mala slova:

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

    Excel IF formula s odgovarajućim regularnim izrazom

    Zbog činjenice da su ugrađeni i prilagođenifunkcije se dobro slažu, ne postoji ništa što bi vas spriječilo da ih koristite zajedno u jednoj formuli.

    Da biste vratili ili izračunali nešto ako se regularni izraz podudara i nešto drugo ako se ne podudara, ugradite prilagođeni RegExpMatch funkcija u logičkom tekstu IF:

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

    Na primjer, ako niz u A5 sadrži valjanu adresu e-pošte, možete vratiti "Da"; inače "Ne".

    =IF(RegExpMatch(A5, $A$2,), "Yes", "No")

    Broji ako se regularni izraz podudara

    Budući da izvorne Excel funkcije ne podržavaju regularne izraze, nije moguće staviti regularni izraz izravno u funkciju COUNTIS ili COUNTIFS. Srećom, ovu funkciju možete oponašati pomoću naše prilagođene funkcije.

    Pretpostavimo da ste upotrijebili regularni izraz za podudaranje telefonskih brojeva i ispis rezultata u stupcu B. Da biste saznali koliko ćelija sadrži telefonske brojeve, samo trebate za prebrojavanje TRUE vrijednosti u B5:B9. A to se lako može učiniti korištenjem standardne formule COUNTIF:

    =COUNTIF(B5:B9, TRUE)

    Ne želite dodatne stupce u svom radnom listu? Nema problema. Imajući na umu da naša prilagođena funkcija može obraditi više ćelija odjednom, a Excelov SUM može zbrajati vrijednosti u nizu, evo što trebate učiniti:

    • Dostavite referencu raspona za RegExpMatch, tako da vraća niz vrijednosti TRUE i FALSE.
    • Upotrijebite dvostruku negaciju (--) da biste prisilili logičke vrijednosti na jedinice inule.
    • Nabavite funkciju SUM za zbrajanje 1 i 0 u rezultirajućem nizu.

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

    Uparivanje regularnih izraza s Ultimate Suiteom

    Korisnici našeg Ultimate Suitea mogu iskoristiti četiri snažne Regex funkcije bez dodavanja VBA koda u svoje radne knjige jer su glatko integrirane u Excel tijekom instalacije dodatka. Naše prilagođene funkcije obrađuje standardni .NET RegEx mehanizam i podržava sveobuhvatne klasične regularne izraze.

    Kako koristiti prilagođenu funkciju RegexMatch

    Pod pretpostavkom da imate instaliranu najnoviju verziju Ultimate Suite ( 2021.4 ili noviji), možete stvoriti formulu Regex Match u dva jednostavna koraka:

    1. Na kartici Ablebits Data , u grupi Text kliknite Alati za regularne izraze .

  • Na oknu Alati za regularne izraze učinite sljedeće:
    • Odaberite izvorne nizove.
    • Unesite svoj uzorak.
    • Odaberite opciju Podudaranje .
    • Da bi rezultati bili formule, a ne vrijednosti, odaberite Potvrdni okvir Umetni kao formulu .
    • Kliknite gumb Podudaranje .

    Trenutak kasnije, funkcija AblebitsRegexMatch umetnuta je u novi stupac desno od vaših podataka.

    Na slici ispod, funkcija provjerava sadrže li nizovi u stupcu A 7-znamenkasti brojeve ili ne.

    Savjeti:

    • Funkcija cija se može umetnuti izravno u ćeliju putem standardnog dijaloškog okvira Insert Function , gdje je kategoriziran pod AblebitsUDFs .
    • Prema zadanim postavkama, formuli se dodaje regularni izraz, ali također možete zadržati to u zasebnoj ćeliji. Za ovo samo upotrijebite referencu ćelije za 2. argument.
    • Prema zadanim postavkama, funkcija je osjetljiva na velika i mala slova . Za podudaranje bez obzira na velika i mala slova upotrijebite uzorak (?i).

    Za više informacija pogledajte funkciju AblebitsRegexMatch.

    Tako se radi podudaranje regularnih izraza u Excelu. Zahvaljujem vam na čitanju i radujem se što ćemo vas vidjeti na našem blogu sljedeći tjedan!

    Dostupna preuzimanja

    Excel Regex Match primjeri (.xlsm datoteka)

    Ultimate Suite 14- dnevna potpuno funkcionalna verzija (.exe datoteka)

    Ako je cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 u cntInputRows, 1 u cntInputCols) For iInputCurRow = 1 u cntInputRows For iInputCurCol = 1 u cntInputCols arRes(iInputCurRow, iInputCurCol) = input_range.Test .Cells(iInputCurRow, iInputCurCol).Value) Next Next RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) End Function

    Zalijepite kod u VBA editor i vaša nova funkcija RegExpMatch je spreman za upotrebu. Ako nemate puno iskustva s VBA, ovaj vodič može biti od pomoći: Kako umetnuti VBA kod u Excel.

    Napomena. Nakon umetanja koda, ne zaboravite spremiti datoteku kao radnu knjigu s omogućenim makronaredbama (.xlsm).

    Sintaksa RegExpMatch

    Funkcija RegExpMatch provjerava podudara li se bilo koji dio izvornog niza s regularnim izrazom. Rezultat je Booleova vrijednost: TRUE ako je pronađeno najmanje jedno podudaranje, FALSE u suprotnom.

    Naša prilagođena funkcija ima 3 argumenta - prva dva su obavezna, a posljednji je neobavezan:

    RegExpMatch(tekst , uzorak, [match_case])

    Gdje:

    • Tekst (obavezno) - jedan ili više nizova za pretraživanje. Može se navesti kao referenca ćelije ili raspona.
    • Uzorak (obavezno) - regularni izraz za podudaranje. Kada se postavi izravno u formulu, uzorak mora biti u dvostrukim navodnicima.
    • Match_case (neobavezno) - definira podudaranjetip. Ako je TRUE ili izostavljeno (zadano), izvodi se uparivanje koje razlikuje velika i mala slova; ako je FALSE - ne razlikuje velika i mala slova.

    Funkcija radi u svim verzijama programa Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 i Excel 2010.

    3 stvari koje trebali znati o RegExpMatchu

    Prije nego što prijeđemo na praktične izračune, obratite pozornost na sljedeće točke koje pojašnjavaju neke tehničke detalje:

    1. Funkcija može obraditi jednu ćeliju ili raspon ćelija . U potonjem slučaju, rezultati se vraćaju u susjednim ćelijama u obliku dinamičkog polja ili raspona izlijevanja, kao što je prikazano u ovom primjeru.
    2. Prema zadanim postavkama, funkcija je osjetljiva na velika i mala slova . Da biste zanemarili velika i mala slova teksta, postavite argument match_case na FALSE. Zbog ograničenja VBA Regexp, uzorak koji ne razlikuje velika i mala slova (?i) nije podržan.
    3. Ako valjani uzorak nije pronađen, funkcija vraća FALSE; ako je uzorak nevažeći , #VALUE! dolazi do pogreške.

    U nastavku ćete pronaći nekoliko primjera podudaranja regularnih izraza koji su stvoreni u svrhu demonstracije. Ne možemo jamčiti da će naši obrasci raditi besprijekorno sa širim rasponom ulaznih podataka u vašim stvarnim radnim listovima. Prije puštanja u proizvodnju svakako testirajte i prilagodite naše uzorke uzoraka prema svojim potrebama.

    Kako koristiti regex za podudaranje nizova u Excelu

    Kada svi nizovi koje želite uskladiti imaju isti uzorak,regularni izrazi idealno su rješenje.

    Pretpostavimo da imate niz ćelija (A5:A9) koje sadrže razne detalje o nekim stavkama. Želite znati koje ćelije imaju SKU-ove. Pod pretpostavkom da se svaki SKU sastoji od 2 velika slova, crtice i 3 znamenke, možete ih spojiti pomoću sljedećeg izraza.

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

    Gdje [A-Z]{2} znači bilo koja 2 velika slova od A do Z, a \d{3} znači bilo koje 3 znamenke od 0 do 9. Znak \b označava riječ granica, što znači da je SKU zasebna riječ, a ne dio većeg niza kao što je 23-MAR-2022.

    S utvrđenim uzorkom, možemo prijeći na pisanje formule. U osnovi, korištenje prilagođene funkcije ne razlikuje se od izvorne. Čim počnete upisivati ​​formulu, naziv funkcije pojavit će se na popisu koji predlaže Excelov AutoComplete. Međutim, postoji nekoliko nijansi u programu Dynamic Array Excel (Microsoft 365 i Excel 2021) i tradicionalnom Excelu (2019 i starije verzije).

    Uparivanje niza u jednoj ćeliji

    Uparivanje niza u jednoj ćeliji, odnosi se na tu ćeliju u prvom argumentu. Drugi argument bi trebao sadržavati regularni izraz.

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

    Uzorak se također može čuvati u unaprijed definiranoj ćeliji koja je zaključana apsolutnom referencom ($A$2):

    =RegExpMatch(A5, $A$2)

    Nakon unosa formule u prvu ćeliju, možete je povući prema dolje u sve ostale retke.

    Ova metodaizvrsno radi u svim verzijama programa Excel .

    Uparite nizove u više ćelija odjednom

    Da biste uparili više nizova s ​​jednom formulom, uključite referencu raspona u prvi argument:

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

    U Excel 365 i Excel 2021 koji podržavaju dinamičke nizove, radi na ovaj način - upišete formulu u prvu ćeliju, pritisnete Enter i formula se automatski prelije u donje ćelije.

    U Excelu 2019 i ranijim verzijama, radi samo kao tradicionalna CSE formula polja, koja se unosi u niz ćelija i dovršava zajedničkim pritiskom tipki Ctrl + Shift + Enter.

    Regex za podudaranje broja

    Za podudaranje bilo koje znamenke od 0 do 9, koristite znak \d u regularnom izrazu. Ovisno o vašem određenom zadatku, dodajte odgovarajući kvantifikator ili izradite složeniji uzorak.

    Regex za podudaranje s bilo kojim brojem

    Za podudaranje s bilo kojim brojem bilo koje duljine, stavite + kvantifikator odmah nakon / d znak, koji kaže da tražite brojeve koji sadrže 1 ili više znamenki.

    Uzorak : \d+

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

    Regularni izraz za podudaranje broja određene duljine

    Ako je vaš cilj podudaranje numeričkih vrijednosti koje sadrže određeni broj znamenki, tada koristite \d zajedno s odgovarajućim kvantifikatorom.

    Na primjer, da biste uskladili brojeve faktura koji se sastoje od točno 7 znamenki, upotrijebite \d{7}. Međutim, imajte na umu da će odgovarati 7očekivano:

    Napomene:

    • Međunarodni kodovi se ne provjeravaju, tako da mogu, ali i ne moraju biti prisutni.
    • U regularnim izrazima, \s označava bilo koji znak razmaka kao što je razmak, tabulator, povratak na početak reda ili novi red. Da biste dopustili samo razmake, koristite [-\. ] umjesto [-\.\s].
    • Regex koji NE odgovara znaku

      Da biste pronašli nizove koji NE sadrže određeni znak, možete koristiti klase negiranih znakova [^ ] koji odgovaraju sve što NIJE u zagradama. Na primjer:

      • [^13] će odgovarati bilo kojem pojedinačnom znaku koji nije 1 ili 3.
      • [^1-3] će odgovarati bilo kojem pojedinačnom znaku koji nije 1, 2 ili 3 (tj. bilo koja znamenka od 1 do 3).

      Pretpostavimo da na popisu telefonskih brojeva želite pronaći one koji nemaju pozivni broj zemlje. Imajući na umu da svaki međunarodni kod uključuje znak +, možete koristiti klasu znakova [^\+] da pronađete nizove koji ne sadrže znak plus. Važno je shvatiti da gornji izraz odgovara svakom pojedinačnom znaku koji nije +. Budući da telefonski broj može biti bilo gdje u nizu, ne nužno na samom početku, kvantifikator * se dodaje za provjeru svakog sljedećeg znaka. Početna ^ i krajnja $ sidra osiguravaju obradu cijelog niza. Kao rezultat, dobivamo donji regularni izraz koji kaže "ne podudaraj se sa znakom + ni na jednom mjestu u nizu".

      Uzorak :^[^\+]*$

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

      Regularni izraz koji NE odgovara nizu

      Iako ne postoji posebna sintaksa regularnog izraza za ne odgovara određenom nizu, možete emulirati ovo ponašanje korištenjem negativnog pretraživanja unaprijed.

      Pretpostavimo da želite pronaći nizove koji ne sadrže riječ "limuni". Ovaj će regularni izraz biti odličan:

      Uzorak : ^((?!limuni).)*$

      Očito je ovdje potrebno neko objašnjenje. Negativni pogled unaprijed (?!limuni) gleda udesno da vidi nema li ispred riječi "limuni". Ako nema "limuna", tada točka odgovara bilo kojem znaku osim prijelomu retka. Gornji izraz izvodi samo jednu provjeru, a kvantifikator * ponavlja je nula ili više puta, od početka niza koji je usidren s ^ do kraja niza koji je usidren s $.

      Da biste zanemarili velika i mala slova teksta, postavili smo 3. argument na FALSE kako bi naša funkcija bila neosjetljiva na velika i mala slova:

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

      Savjeti i bilješke:

      • Gornji regularni izraz radi samo za jednoredne nizove. U slučaju nizova s ​​nekoliko redaka, znakovi ^ i $ odgovaraju početku i kraju svakog retka umjesto početku i kraju niza unosa, stoga regularni izraz traži samo u prvom retku.
      • Za podudaranje nizova koji ne počinju određenim tekstom , koristite regularni izraz kao što je ^(?!lemons).*$
      • Za podudaranje nizova koji ne završavaju određenim tekstom , uključitezavršni niz usidren u obrazac pretraživanja: ^((?!lemons$).)*$

      Uparivanje bez obzira na velika i mala slova

      U klasičnim regularnim izrazima postoji poseban obrazac za podudaranje bez obzira na velika i mala slova (?i), koje nije podržano u VBA RegExp. Kako bi se prevladalo ovo ograničenje, naša prilagođena funkcija prihvaća treći izborni argument pod nazivom match_case . Za uparivanje bez obzira na velika i mala slova jednostavno ga postavite na FALSE.

      Recimo da želite identificirati datume kao što su 1-3-22 ili 01-MAR-2022. Za podudaranje formata dd-mmm-yyyy i d-mmm-yyy koristimo sljedeći regularni izraz.

      Uzorak : \b\d{1,2}-(siječanjznamenki bilo gdje u nizu uključujući 10-znamenkasti ili 100-znamenkasti broj. Ako ovo nije ono što tražite, stavite granicu riječi \b na obje strane.

      Uzorak : \b\d{7}\b

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

      Regularni izraz za podudaranje telefonskih brojeva

      Budući da se telefonski brojevi mogu pisati u različitim formatima, njihovo podudaranje zahtijeva sofisticiraniji regularni izraz.

      U donjem skupu podataka tražit ćemo 10-znamenkastih brojeva koji imaju 3 znamenke u prve 2 grupe i 4 znamenke u posljednjoj grupi. Grupe se mogu odvojiti točkom, crticom ili razmakom. Prva grupa može ali ne mora biti u zagradama.

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

    Michael Brown predani je tehnološki entuzijast sa strašću za pojednostavljivanjem složenih procesa pomoću softverskih alata. S više od desetljeća iskustva u tehnološkoj industriji, usavršio je svoje vještine u Microsoft Excelu i Outlooku, kao i Google tablicama i dokumentima. Michaelov blog posvećen je dijeljenju znanja i stručnosti s drugima, pružajući savjete i upute koje je lako slijediti za poboljšanje produktivnosti i učinkovitosti. Bez obzira jeste li iskusni profesionalac ili početnik, Michaelov blog nudi vrijedne uvide i praktične savjete za izvlačenje maksimuma iz ovih osnovnih softverskih alata.