Sadržaj
U ovom vodiču imat ćemo detaljan pogled na to kako koristiti regex za podudaranje nizova u Excelu.
Kada trebate pronaći određenu vrijednost u rasponu ćelija, koristili biste funkciju MATCH ili XMATCH. Kada tražite određeni niz u ćeliji, funkcije FIND i SEARCH su korisne. A kako znate da li ćelija sadrži informacije koje odgovaraju datom uzorku? Očigledno, korištenjem regularnih izraza. Ali iz kutije Excel ne podržava regularne izraze! Bez brige, natjerat ćemo ga da :)
Excel VBA Regex funkcija za uparivanje nizova
Kao što je prilično jasno iz naslova, kako bi se koristili regularni izrazi u Excelu morate kreirati vlastitu funkciju. Srećom, Excelov VBA ima ugrađeni RegExp objekat, koji možete koristiti u svom kodu kao što je prikazano ispod:
Javna funkcija RegExpMatch(input_range As Range, pattern As String, Optional match_case As Boolean = True) As Variant Dim arRes() As Variant 'niz za pohranjivanje rezultata Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'indeks trenutnog reda u izvornom rasponu, indeks tekuće kolone u izvornom rasponu, broj redova, broj stupci On Error GoTo ErrHandl RegExpMatch = arRes Set regex = CreateObject ( "VBScript.RegExp") regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case Tada regex.ignoresee rex = Flex.ignoresee. Krajizrazi.Obrazac : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\- ]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b
Da bismo bolje razumeli šta se ovde dešava, pogledajmo detaljnije svaki deo. :
- Korisničko ime može uključivati slova, brojeve, donje crte, tačke i crtice. Imajući na umu da \w odgovara bilo kojem slovu, cifri ili donjoj crti, dobijamo sljedeći regex: [\w\.\-]+
- Ime domene može uključivati velika i mala slova, cifre, crtice (ali ne na prvoj ili zadnjoj poziciji) i tačke (u slučaju poddomena). Pošto donje crte nisu dozvoljene, umjesto \w koristimo 3 različita skupa znakova: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
- Domen najvišeg nivoa sastoji se od tačke iza 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. Obrazac pretpostavlja da ime domene sadrži 2 ili više alfanumeričkih znakova.
Sa originalnim tekstom u A5 i uzorkom u A5, formula poprima ovaj oblik:
=RegExpMatch(A5, $A$2)
Ili možete koristiti jednostavniji regularni izraz za provjeru valjanosti e-pošte s malim ili velikim skupom znakova:
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 regexom
Zbog činjenice da je ugrađena i prilagođenafunkcije 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 podudari regularni izraz 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 ispravnu adresu e-pošte, možete vratiti "Yes"; inače "Ne".
=IF(RegExpMatch(A5, $A$2,), "Yes", "No")
Računaj ako se podudara s regularnim izrazom
Budući da izvorne Excel funkcije ne podržavaju regularne izraze, to je nije moguće staviti regex direktno u funkciju COUNTIS ili COUNTIFS. Srećom, ovu funkcionalnost možete emulirati pomoću naše prilagođene funkcije.
Pretpostavimo da ste koristili regex za uparivanje telefonskih brojeva i ispis rezultata u kolonu B. Da biste saznali koliko ćelija sadrži brojeve telefona, trebate samo za prebrojavanje TRUE vrijednosti u B5:B9. A to se lako može uraditi pomoću standardne formule COUNTIF:
=COUNTIF(B5:B9, TRUE)
Ne želite dodatne kolone u svom radnom listu? Nema problema. Imajući na umu da naša prilagođena funkcija može obraditi više ćelija u isto vrijeme i da Excelov SUM može zbrajati vrijednosti u nizu, evo što trebate učiniti:
- Navedite referencu raspona za RegExpMatch, tako da vraća niz TRUE i FALSE vrijednosti.
- Koristite dvostruku negaciju (--) da natjerate logičke vrijednosti na jedinice inule.
- Nabavite funkciju SUM da zbrojite 1 i 0 u rezultirajućem nizu.
=SUM(--RegExpMatch(A5:A9, $A$2))
Regex podudaranje sa Ultimate Suite
Korisnici našeg Ultimate Suite-a mogu iskoristiti četiri moćne funkcije Regex-a bez dodavanja VBA koda u svoje radne sveske jer su glatko integrisani u Excel tokom instalacije dodatka. Naše prilagođene funkcije se obrađuju pomoću standardnog .NET RegEx motora i podržavaju klasične regularne izraze s punim mogućnostima.
Kako koristiti prilagođenu funkciju RegexMatch
Pod pretpostavkom da imate instaliranu najnoviju verziju Ultimate Suite ( 2021.4 ili noviji), možete kreirati formulu podudaranja s Regex u dva jednostavna koraka:
- Na kartici Ablebits Data , u grupi Text kliknite Regex alati .
- Odaberi izvorne nizove.
- Unesite svoj uzorak.
- Odaberite opciju Match .
- Da biste imali rezultate kao formule, a ne vrijednosti, odaberite Umetni kao formulu potvrdni okvir.
- Kliknite na dugme Match .
Trenutak kasnije, funkcija AblebitsRegexMatch je umetnuta u novu kolonu desno od vaših podataka.
Na snimku ekrana ispod, funkcija provjerava da li nizovi u koloni A sadrže 7 cifara brojevi ili ne.
Savjeti:
- Funkcija cija se može umetnuti direktno u ćeliju preko standardnog Insert Function dijaloškog okvira, gdje je kategoriziran pod AblebitsUDFs .
- Prema zadanim postavkama, regularni izraz se dodaje formuli, ali također možete zadržati u posebnoj ćeliji. Za ovo, samo koristite 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, koristite (?i) obrazac.
Za više informacija pogledajte funkciju AblebitsRegexMatch.
Tako se radi podudaranje regularnog izraza u Excelu. Zahvaljujem vam na čitanju i radujem se što ću vas vidjeti na našem blogu sljedeće sedmice!
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 do cntInputRows, 1 do cntInputCols) Za iInputCurRow = 1 za cntInputRows Za iInputCurCol = 1 To cntInputRows Za iInputCurCol = 1 do cntInputCols = 1 do cntInputCols = 1 To cntInputCols = 1 To cntInputRows(u cntInputRows, 1 do cntInputRows) .Cells(iInputCurRow, iInputCurCol).Value) Dalje Sljedeće RegExpMatch = arRes Izlazna funkcija ErrHandl: RegExpMatch = CVERr(xlErrValue) Krajnja funkcijaZalijepite kod u VBA editor, a vaša nova RegExp funkcija je Match spreman za upotrebu. Ako nemate mnogo iskustva sa VBA, ovaj vodič može biti od pomoći: Kako umetnuti VBA kod u Excel.
Napomena. Nakon umetanja koda, ne zaboravite da sačuvate datoteku kao radnu svesku sa omogućenim makroima (.xlsm).
RegExpMatch sintaksa
Funkcija RegExpMatch provjerava da li bilo koji dio izvornog niza odgovara regularnom izrazu. Rezultat je Booleova vrijednost: TRUE ako je pronađeno barem jedno podudaranje, FALSE u suprotnom.
Naša prilagođena funkcija ima 3 argumenta - prva dva su obavezna, a posljednji je opcionalan:
RegExpMatch(text , uzorak, [match_case])Gdje:
- Tekst (obavezno) - jedan ili više nizova za pretraživanje. Može se dostaviti kao referenca ćelije ili raspona.
- Uzorak (obavezno) - regularni izraz za podudaranje. Kada se postavi direktno u formulu, obrazac mora biti stavljen u dvostruke navodnike.
- Match_case (opciono) - definira podudaranjetip. Ako je TRUE ili izostavljeno (podrazumevano), vrši se podudaranje osjetljivo na velika i mala slova; ako je FALSE - bez obzira na velika i mala slova.
Funkcija radi u svim verzijama Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 i Excel 2010.
3 stvari koje treba znati o RegExpMatch
Prije nego što pređemo na praktične proračune, obratite pažnju na sljedeće točke koje pojašnjavaju neke tehničke detalje:
- Funkcija može obraditi jednu ćeliju ili opseg ćelija . U potonjem slučaju, rezultati se vraćaju u susjedne ćelije u obliku dinamičkog niza ili raspona prelivanja, kao što je prikazano u ovom primjeru.
- Prema zadanim postavkama, funkcija je osjetljiva na velika i mala slova . Da zanemarite velika i mala slova, postavite argument match_case na FALSE. Zbog ograničenja VBA Regexpa, obrazac neosjetljiv na velika i mala slova (?i) nije podržan.
- Ako valjani obrazac nije pronađen, funkcija vraća FALSE; ako je obrazac nevažeći , #VRIJEDNOST! javlja se greška.
U nastavku ćete naći nekoliko primjera podudaranja regularnih izraza koji su kreirani u svrhu demonstracije. Ne možemo garantirati da će naši obrasci raditi besprijekorno sa širim rasponom ulaznih podataka u vašim stvarnim radnim listovima. Prije puštanja u proizvodnju, obavezno testirajte i prilagodite naše uzorke uzoraka prema vašim potrebama.
Kako koristiti regex za uparivanje nizova u Excelu
Kada svi nizovi koje želite uskladiti imaju isti obrazac,regularni izrazi su idealno rješenje.
Pretpostavimo da imate niz ćelija (A5:A9) koje sadrže različite detalje o nekim stavkama. Želite znati koje ćelije imaju SKU-ove. Uz pretpostavku da se svaki SKU sastoji od 2 velika slova, crtice i 3 cifre, možete ih upariti koristeći sljedeći izraz.
Obrazac : \b[A-Z]{2}-\ d{3}\b
Gdje [A-Z]{2} označava bilo koja 2 velika slova od A do Z, a \d{3} znači bilo koje 3 cifre 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.
Sa uspostavljenim obrascem, možemo prijeći na pisanje formule. U suštini, korištenje prilagođene funkcije se ne razlikuje od izvorne. Čim počnete da kucate formulu, ime funkcije će se pojaviti na listi koju predlaže Excel AutoComplete. Međutim, postoji nekoliko nijansi u Dynamic Array Excel-u (Microsoft 365 i Excel 2021) i tradicionalnom Excelu (2019 i starije verzije).
Upari niz u jednoj ćeliji
Za podudaranje niza u jednoj ćeliji, referirajte se na tu ćeliju u prvom argumentu. Drugi argument bi trebao sadržavati regularni izraz.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
Obrazac se također može zadržati u unaprijed definiranoj ćeliji, koja je zaključana apsolutnom referencom ($A$2):
=RegExpMatch(A5, $A$2)
Nakon što unesete formulu u prvu ćeliju, možete je povući dolje u sve ostale redove.
Ova metodaradi lijepo u svim verzijama Excela .
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, funkcionira na ovaj način - upišete formulu u prvu ćeliju, pritisnete Enter i formula se automatski prelije u donje ćelije.
U Excel 2019 i ranije, to radi samo kao tradicionalna formula CSE niza, koja se unosi u raspon ćelija i završava zajedničkim pritiskom na Ctrl + Shift + Enter.
Regeks za podudaranje broja
Za podudaranje bilo koje pojedinačne znamenke od 0 do 9, koristite znak \d u redovnom izrazu. Ovisno o vašem konkretnom zadatku, dodajte odgovarajući kvantifikator ili kreirajte složeniji obrazac.
Regeks za podudaranje s bilo kojim brojem
Da biste podudarili bilo koji broj bilo koje dužine, stavite kvantifikator + odmah iza / znak d, koji kaže da se traže brojevi koji sadrže 1 ili više cifara.
Obrazac : \d+
=RegExpMatch(A5:A9, "\d+")
Regex za podudaranje broja određene dužine
Ako je vaš cilj da uparite numeričke vrijednosti koje sadrže određeni broj znamenki, tada koristite \d zajedno s odgovarajućim kvantifikatorom.
Na primjer, za podudaranje brojeva računa koji se sastoje od tačno 7 cifara, koristili biste \d{7}. Međutim, imajte na umu da će se podudarati sa 7kako se očekuje:
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 red ili novi red. Da dozvolite samo razmake, koristite [-\. ] umjesto [-\.\s].
- [^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 cifra od 1 do 3).
- Gornji regularni izraz radi samo za jednolinije nizove. U slučaju stringova milti-redova, znakovi ^ i $ odgovaraju početku i kraju svakog reda umjesto početka i kraja ulaznog niza, stoga regex traži samo u prvom redu.
- Da uparite nizove koji ne počinju sa određenim tekstom , koristite regularni izraz kao što je ^(?!lemoni).*$
- Da biste uskladili nizove koji ne završavaju sa određenim tekstom , uključitekrajnji niz se sidri u obrazac pretraživanja: ^((?!lemons$).)*$
Regex da NE odgovara znaku
Da biste pronašli nizove koji NE sadrže određeni znak, možete koristiti negirane klase znakova [^ ] koje se podudaraju bilo šta NE u zagradama. Na primjer:
U listi telefonskih brojeva, pretpostavimo da ž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 broj telefona može biti bilo gdje u nizu, ne nužno na samom početku, kvantifikator * se dodaje za provjeru svakog sljedećeg znaka. Početak ^ i kraj $ sidra osiguravaju da se cijeli niz obradi. Kao rezultat, dobijamo donji regularni izraz koji kaže "ne odgovara znaku + ni na jednoj poziciji u nizu".
Uzorak :^[^\+]*$
=RegExpMatch(A5, "^[^\+]*$")
Regex da NE odgovara stringu
Iako ne postoji posebna sintaksa regularnog izraza za ne podudarajući se s određenim nizom, možete oponašati ovo ponašanje korištenjem negativnog pogleda unaprijed.
Pretpostavimo da želite pronaći nizove koji ne sadrže riječ "limoni". Ovaj regularni izraz će raditi kao poslastica:
Uzorak : ^((?!limoni).)*$
Očigledno je ovdje potrebno neko objašnjenje. Negativni pogled naprijed (?!limoni) gleda udesno da vidi da li ispred nema riječi "limuni". Ako "limuna" nema, tada tačka odgovara bilo kojem znaku osim prijeloma reda. Gornji izraz obavlja samo jednu provjeru, a kvantifikator * ga ponavlja nula ili više puta, od početka niza usidrenog sa ^ do kraja niza usidrenog sa $.
Da zanemarite velika i mala slova teksta, postavljamo 3. argument na FALSE kako bismo našu funkciju učinili neosjetljivom na velika i mala slova:
=RegExpMatch(A5, $A$2, FALSE)
Savjeti i napomene:
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. Da bi se prevazišlo ovo ograničenje, naša prilagođena funkcija prihvata treći opcioni argument pod nazivom match_case . Da biste izvršili podudaranje bez obzira na velika i mala slova, jednostavno ga postavite na FALSE.
Recimo da želite identificirati datume kao što su 1-Mar-22 ili 01-MAR-2022. Da bismo uskladili formate dd-mmm-yyyy i d-mmm-yy , koristimo sljedeći regularni izraz.
Uzorak : \b\d{1,2}-(Jancifre bilo gdje u nizu, uključujući 10-cifreni ili 100-cifreni 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")
Regeks za uparivanje telefonskih brojeva
Pošto se brojevi telefona mogu pisati u različitim formatima, njihovo uparivanje zahtijeva sofisticiraniji regularni izraz.
U donjem skupu podataka tražit ćemo 10-cifrene brojeve koji imaju 3 cifre u prve 2 grupe i 4 cifre u posljednjoj grupi. Grupe se mogu odvojiti tačkom, crticom ili razmakom. Prva grupa može, ali i ne mora biti zatvorena u zagradama.
Uzorak: (\(\d{3}\)