Sadržaj
U ovom vodiču ćete naučiti kako koristiti regularne izraze u Excelu za pronalaženje i izdvajanje podnizova koji odgovaraju datom uzorku.
Microsoft Excel pruža brojne funkcije za izdvajanje teksta iz ćelija. Te funkcije se mogu nositi s većinom izazova ekstrakcije stringova u vašim radnim listovima. Većina, ali ne svi. Kada se funkcije teksta spotaknu, regularni izrazi dolaze u pomoć. Čekaj… Excel nema funkcije RegEx! Istina, nema ugrađenih funkcija. Ali ne postoji ništa što bi vas spriječilo da koristite svoje :)
Excel VBA Regex funkcija za izdvajanje nizova
Da dodate prilagođenu funkciju Regex Extract u svoj Excel, zalijepite sljedeći kod u VBA editor. Da bismo omogućili regularne izraze u VBA, koristimo ugrađeni Microsoft RegExp objekat.
Javna funkcija RegExpExtract(tekst kao string, obrazac kao niz, opcioni broj_instance kao ceo broj = 0, opcioni match_case kao logičan = tačan) 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 Ako je True onda = Re match_ca ignorecase = False Else regex.ignorecase = True End Ako se skup podudara = regex.Execute(text) Ako je 0 < matches.Count Then If (0 = instance_num) Then ReDim text_matches(matches.Count - 1, 0) Za matches_index = 0 ToVBA RegExp, ohrabrujem vas da pročitate sljedeći dio koji govori o mnogo moćnijim .NET Regex funkcijama.Prilagođena .NET bazirana Regex funkcija za izdvajanje teksta u Excel
Za razliku od VBA RegExp funkcija koje može napisati bilo koji korisnik Excela, .NET RegEx je područje programera. Microsoft .NET Framework podržava potpunu sintaksu regularnog izraza kompatibilnu sa Perl 5. Ovaj članak vas neće naučiti kako da napišete takve funkcije (ja nisam programer i nemam ni najmanju ideju kako to učiniti :)
Četiri moćne funkcije koje obrađuje standardni .NET RegEx mehanizam su već napisali naši programeri i uključene u Ultimate Suite. U nastavku ćemo demonstrirati neke praktične upotrebe funkcije posebno dizajnirane za izdvajanje teksta u Excelu.
Savjet. Za informacije o .NET Regex sintaksi, pogledajte .NET Regular Expression Language.
Kako izdvojiti ubode u Excelu koristeći regularne izraze
Pod pretpostavkom da imate instaliranu najnoviju verziju Ultimate Suite-a, izdvajanje teksta pomoću regularnih izraza svodi se na ova dva koraka:
- Na kartici Ablebits Data , u grupi Text kliknite na Regex Tools .
- U oknu Regex Tools odaberite izvorne podatke, unesite svoj obrazac regularnog izraza i odaberite opciju Extract . Da dobijete rezultat kao prilagođenu funkciju, a ne vrijednost, odaberite kvačicu Umetni kao formulu kutija. Kada završite, kliknite na dugme Izdvoji .
Rezultati će se pojaviti u novoj koloni desno od vaših originalnih podataka:
AblebitsRegexExtract sintaksa
Naša prilagođena funkcija ima sljedeću sintaksu:
AblebitsRegexExtract(referenca, regular_expression)Gdje:
- Reference (obavezno) - referenca na ćeliju koja sadrži izvorni niz.
- Regularni_izraz (obavezno) - obrazac regularnog izraza koji se podudara.
Važna napomena! Funkcija radi samo na mašinama s instaliranim Ultimate Suite for Excel.
Napomene o korištenju
Da bi vaša kriva učenja bila glatkija i vaše iskustvo ugodnije, obratite pažnju na ove točke:
- Da biste kreirali formulu, možete koristiti naše Regex alate ili Excelov dijaloški okvir Umetanje funkcije ili upisati puno ime funkcije u ćeliju. Jednom kada je formula umetnuta, možete njome upravljati (uređivati, kopirati ili premještati) kao bilo kojom prirodnom formulom.
- Obrazac koji unosite u oknu Regex Tools ide na 2. argument. Također je moguće zadržati regularni izraz u posebnoj ćeliji. U ovom slučaju, samo koristite referencu ćelije za 2. argument.
- Funkcija izdvaja prvo pronađeno podudaranje .
- Prema zadanim postavkama, funkcija je case -osjetljivo . Za podudaranje bez obzira na velika i mala slova, koristite obrazac (?i).
- Ako podudaranje nije pronađeno, greška #N/Avraćeno.
Regex za izdvajanje niza između dva znaka
Da biste dobili tekst između dva znaka, možete koristiti ili grupu za snimanje ili pregledavanje.
Hajde recimo da želite izdvojiti tekst između zagrada. Grupa za snimanje je najlakši način.
Obrazac 1 : \[(.*?)\]
Sa pozitivnim pogledom iza i unaprijed, rezultat će biti upravo isto.
Obrazac 2 : (?<=\[)(.*?)(?=\])
Obratite pažnju da naša grupa za snimanje (.*?) izvodi lijenu pretragu za tekstom između dvije zagrade - od prvog [ do prvog ]. Grupa za hvatanje bez upitnika (.*) izvršila bi pohlepnu pretragu i uhvatila sve od prvog [ do posljednjeg ].
Sa uzorkom u A2, formula ide kao slijedi:
=AblebitsRegexExtract(A5, $A$2)
Kako dobiti sva podudaranja
Kao što je već spomenuto, funkcija AblebitsRegexExtract može izdvojiti samo jedno podudaranje. Da biste dobili sva podudaranja, možete koristiti VBA funkciju o kojoj smo ranije govorili. Međutim, postoji jedno upozorenje - VBA RegExp ne podržava hvatanje grupa, tako da će gornji obrazac vratiti i "granične" znakove, u našem slučaju zagrade.
=TEXTJOIN(" ", TRUE, RegExpExtract(A5, $A$2))
Da biste se riješili od zagrada, ZAMJENITE ih praznim nizovima ("") koristeći ovu formulu:
=SUBSTITUTE(SUBSTITUTE(TEXTJOIN(", ", TRUE, RegExpExtract(A5, $A$2)), "]", ""),"[","")
Za bolju čitljivost, koristimo zarez za graničnik.
Regex za izdvajanje teksta između dva niza
Pristup na kojem smo radilitumači doslovno).
U zavisnosti od toga koji je regularni izraz unesen u A2, formula ispod će dati različite rezultate:
=AblebitsRegexExtract(A5, $A$2)
Regex za izdvajanje punog naziva domene sa svim poddomenama:
Regex za izdvajanje drugog nivoa domene bez poddomena:
Tako možete izdvojiti dijelove teksta u Excelu koristeći regularne izraze. Zahvaljujem vam što ste čitali i radujem se što ću vas vidjeti na našem blogu sljedeće sedmice!
Dostupna preuzimanja
Primjeri izvlačenja Excel Regex (.xlsm datoteka)
Probna verzija Ultimate Suite (.exe datoteka)
\b(0?[0-9]matches.Count - 1 text_matches(matches_index, 0) = matches.Item(matches_index) Sljedeći matches_index RegExpExtract = text_matches Else RegExpExtract = matches.Item(instance_num - 1) End If End If Exit Function ErrHandl: RegVErraExluction = C EndExpExluctionAko imate malo iskustva sa VBA-om, može vam pomoći korisnički vodič korak po korak: Kako umetnuti VBA kod u Excel.
Napomena. Da bi funkcija radila, obavezno sačuvajte datoteku kao radnu svesku sa omogućenom makronaredbom (.xlsm).
RegExpExtract sintaksa
Funkcija RegExpExtract pretražuje ulazni niz za vrijednosti koje odgovaraju regularnom izrazu i izdvaja jedno ili sva podudaranja.
Funkcija ima sljedeću sintaksu :
RegExpExtract(tekst, uzorak, [broj_instance], [match_case])Gdje:
- Tekst (obavezno) - tekstualni niz za pretraživanje.
- Uzorak (obavezno) - regularni izraz za podudaranje. Kada se unese direktno u formulu, obrazac treba staviti u dvostruke navodnike.
- Instance_num (opciono) - serijski broj koji pokazuje koju instancu treba izdvojiti. Ako se izostavi, vraća sva pronađena podudaranja (podrazumevano).
- Match_case (opcionalno) - definira da li će se podudarati ili zanemariti velika i mala slova teksta. 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 programa Excel 365, Excel 2021, Excel2019, Excel 2016, Excel 2013 i Excel 2010.
4 stvari koje biste trebali znati o RegExpExtract
Da biste efikasno koristili funkciju u svom Excelu, postoji nekoliko važnih stvari na koje treba obratiti pažnju:
- Podrazumevano, funkcija vraća sva pronađena podudaranja u susjedne ćelije kao što je prikazano u ovom primjeru. Da biste dobili specifično pojavljivanje, dostavite odgovarajući broj argumentu instance_num .
- Prema zadanim postavkama, funkcija je osjetljiva na velika i mala slova . Za podudaranje bez obzira na velika i mala slova, postavite argument match_case na FALSE. Zbog VBA ograničenja, konstrukcija koja ne razlikuje velika i mala slova (?i) neće raditi.
- Ako važeći obrazac nije pronađen , funkcija ne vraća ništa (prazan niz).
- Ako je obrazac nevažeći , #VRIJEDNOST! javlja se greška.
Prije nego počnete koristiti ovu prilagođenu funkciju u svojim radnim listovima, morate razumjeti za šta je ona sposobna, zar ne? Primjeri u nastavku pokrivaju nekoliko uobičajenih slučajeva upotrebe i objašnjavaju zašto se ponašanje može razlikovati u Dynamic Array Excel-u (Microsoft 365 i Excel 2021) i tradicionalnom Excelu (2019 i starije verzije).
Napomena. Naši primjeri regularnih izraza su napisani za prilično jednostavne skupove podataka. Ne možemo garantirati da će raditi besprijekorno u vašim pravim radnim listovima. Oni koji imaju iskustva s regexom složili bi se da je pisanje regularnih izraza beskrajni put ka savršenstvu - gotovo uvijek postoji način da seelegantniji je ili sposoban za rukovanje širim rasponom ulaznih podataka.
Regex za izdvajanje broja iz niza
Slijedeći osnovnu maksimu učenja "od jednostavnog do složenog", počećemo s vrlo jednostavnim slučajem: izdvajanje broja iz niza.
Prva stvar koju trebate odlučiti je koji broj ćete dobiti: prvi, posljednji, određeni događaj ili sve brojeve.
Izdvoji prvi broj
Ovo je jednostavno kao što regex može dobiti. S obzirom da \d znači bilo koju cifru od 0 do 9, a + znači jedan ili više puta, naš regularni izraz ima ovaj oblik:
Obrazac : \d+
Postavi instance_num do 1 i dobićete željeni rezultat:
=RegExpExtract(A5, "\d+", 1)
Gdje je A5 originalni niz.
Za praktičnost, možete unijeti uzorak u unaprijed definiranoj ćeliji ($A$2) i zaključajte njenu adresu znakom $:
=RegExpExtract(A5, $A$2, 1)
Dobijte posljednji broj
Da biste izdvojili posljednji broj u nizu , evo uzorka za korištenje:
Obrazac : (\d+)(?!.*\d)
Prevedeno na ljudski jezik , kaže: pronađite broj koji ne prati (nigdje, ne samo odmah) nijedan drugi broj. Da bismo to izrazili, koristimo negativan pogled unaprijed (?!.*\d), što znači da desno od uzorka ne bi trebalo biti druge cifre (\d) bez obzira na to koliko drugih znakova ima ispred nje.
=RegExpExtract(A5, "(\d+)(?!.*\d)")
Savjeti:
- Da dobijete specifičnu pojavu , koristite \d+ za uzorak i odgovarajući serijskibroj za instance_num .
- Formula za izdvajanje svih brojeva razmatra se u sljedećem primjeru.
Regex za izdvajanje svih podudaranja
Pogurajući naš primjer malo dalje, pretpostavimo da želite dobiti sve brojeve iz niza, a ne samo jedan.
Kao što se možda sjećate, broj izdvojenih podudaranja kontrolira opcijski broj_instance argument. Zadana postavka su sva podudaranja, tako da jednostavno izostavite ovaj parametar:
=RegExpExtract(A2, "\d+")
Formula lijepo funkcionira za jednu ćeliju, ali ponašanje se razlikuje u Dynamic Array Excel-u i nedinamičkim verzijama.
Excel 365 i Excel 2021
Zbog podrške za dinamičke nizove, redovna formula se automatski prelijeva u onoliko ćelija koliko je potrebno za prikaz svih izračunatih rezultata. U smislu Excela, ovo se zove prosuti raspon:
Excel 2019 i niži
U preddinamičkom Excelu, gornja formula bi vratila samo jedno podudaranje. Da biste dobili više podudaranja, potrebno je da to bude formula niza. Da biste to učinili, odaberite raspon ćelija, upišite formulu i pritisnite Ctrl + Shift + Enter da biste je dovršili.
Nedostatak ovog pristupa je gomila #N/A grešaka koje se pojavljuju u "dodatnim ćelijama" . Nažalost, tu se ništa ne može učiniti (ni IFERROR ni IFNA to ne mogu popraviti, nažalost).
Izdvoji sva podudaranja u jednoj ćeliji
Kada obrađujemo kolonu podataka, gornji pristup očigledno neće raditi. U ovom slučaju idealno rješenjebi vraćao sva podudaranja u jednoj ćeliji. Da biste to učinili, poslužite rezultate RegExpExtract funkciji TEXTJOIN i razdvojite ih bilo kojim graničnikom koji želite, recite zarezom i razmakom:
=TEXTJOIN(", ", TRUE, RegExpExtract(A5, "\d+"))
Napomena. Budući da je funkcija TEXTJOIN dostupna samo u Excelu za Microsoft 365, Excel 2021 i Excel 2019, formula neće raditi u starijim verzijama.
Regeks za izdvajanje teksta iz niza
Izdvajanje teksta iz alfanumerički niz je prilično izazovan zadatak u Excelu. Sa regularnim izrazom, postaje lako kao pita. Samo koristite negiranu klasu da uskladite sve što nije cifra.
Uzorak : [^\d]+
Da dobijete podnizove u pojedinačnim ćelijama (raspon razlivanja) , formula je:
=RegExpExtract(A5, "[^\d]+")
Da biste izveli sva podudaranja u jednu ćeliju, ugnijezdite funkciju RegExpExtract u TEXTJOIN ovako:
=TEXTJOIN("", TRUE, RegExpExtract(A5, "[^\d]+"))
Regex u izdvoji adresu e-pošte iz stringa
Da biste izvukli adresu e-pošte iz niza koji sadrži mnogo različitih informacija, napišite regularni izraz koji replicira strukturu adrese e-pošte.
Obrazac : [\w\.\-]+@[A-Za-z0-9\.\-]+\.[A-Za-z]{2,24}
Razbijanje ovog redovnog izraza , evo što dobijamo:
- [\w\.\-]+ je korisničko ime koje može uključivati 1 ili više alfanumeričkih znakova, donjih crta, tačaka i crtica.
- @ simbol
- [A-Za-z0-9\.\-]+ je ime domene koje se sastoji od: velikih i malih slova, cifara, crtica i tačaka (u slučajupoddomena). Podvlake ovdje nisu dozvoljene, stoga se koriste 3 različita skupa znakova (kao što su A-Z a-z i 0-9) umjesto \w koji odgovara bilo kojem slovu, cifri ili donjoj crti.
- \.[A-Za-z] ]{2,24} je domen najvišeg nivoa. Sastoji se od tačke iza koje slijede velika i mala slova. Većina domena najvišeg nivoa ima 3 slova (npr. .com .org, .edu, itd.), ali u teoriji može sadržavati od 2 do 24 slova (najduži registrovani TLD).
Pod pretpostavkom da je niz u A5, a obrazac u A2, formula za izdvajanje adrese e-pošte je:
=RegExpExtract(A5, $A$2)
Regex za izdvajanje domene iz e-pošte
Kada se Kada dođe do izdvajanja domene e-pošte, prva misao koja vam pada na pamet je korištenje grupe za hvatanje kako bi pronašli tekst koji odmah slijedi znak @.
Obrazac : @([A-Za-z0 -9\.\-]+\.[A-Za-z]{2,24})
Poslužite ga našoj funkciji RegExp:
=RegExpExtract(A5, "@([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})")
I dobit ćete ovaj rezultat:
Sa klasičnim regularnim izrazima, sve što je izvan grupe za hvatanje nije uključeno u ekstrakciju. Niko ne zna zašto VBA RegEx radi drugačije i hvata "@". Da biste ga se riješili, možete ukloniti prvi znak iz rezultata tako što ćete ga zamijeniti praznim nizom.
=REPLACE(RegExpExtract(A5, "@([a-z\d][a-z\d\-\.]*\.[a-z]{2,})", 1, FALSE), 1, 1, "")
Regularni izraz za izdvajanje brojeva telefona
Broj telefona može se napisati na mnogo različitih načina, zbog čega je gotovo nemoguće doći do rješenja koje funkcionira pod svim(\d{4}from string
Regularni izraz za izdvajanje datuma ovisi o formatu u kojem se datum pojavljuje unutar niza. Na primjer:
Da biste izdvojili datume kao što su 1/1/21 ili 01/01/2021, regex je: \d{1,2}\/\d{1,2}\/(\d {4}okolnosti. Ipak, možete zapisati sve formate koji se koriste u vašem skupu podataka i pokušati ih uskladiti.
Za ovaj primjer, kreirat ćemo regex koji će izdvojiti brojeve telefona u bilo kojem od ovih formata:
(123) 345-6789 (123) 345 6789 (123)3456789 123- 345-6789 | 123.345.6789 123 345 6789 1233456789 |
Obrazac : \(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b
- Prvi dio \(?\d{3} odgovara nuli ili jednoj početnoj zagradi nakon čega slijede tri cifre d{3}.
- Dio [-\. \)]* označava bilo koji znak u uglastim zagradama koji se pojavljuje 0 ili više puta: crtica, tačka, razmak ili zagrada.
- Dalje, imamo tri cifre ponovo d{3} praćene bilo koja crtica, tačka ili razmak [-\. ]? pojavljuje se 0 ili 1 put.
- Nakon toga, slijedi grupa od četiri cifre \d{4}.
- Konačno, postoji granica riječi \b koja definira da smo telefonski broj traženje ne može biti dio većeg broja.
Kompletna formula ima ovaj oblik:
=RegExpExtract(A5, "\(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b")
Imajte na umu da gornji regex može vratiti nekoliko lažno pozitivni rezultati kao što su 123) 456 7899 ili (123 456 7899. Verzija ispod popravlja ove probleme. Međutim, ova sintaksa radi samo u VBA RegExp funkcijama, ne u klasičnim regularnim izrazima.
Uzorak : (\(\d{3}\)out za izvlačenje teksta između dva znaka će također raditi za izdvajanje teksta između dva niza.
Na primjer, da biste dobili sve između "test 1" i "test 2", koristite sljedeći regularni izraz.
Uzorak : test 1(.*?)test 2
Kompletna formula je:
=AblebitsRegexExtract(A5, "test 1(.*?)test 2")
Regex za izdvajanje domene iz URL-a
Čak i sa regularnim izrazima, izdvajanje imena domena iz URL-ova nije trivijalan zadatak. Ključni element koji radi trik je nehvatanje grupa. Ovisno o vašem krajnjem cilju, odaberite jedan od sljedećih regularnih izraza.
Da biste dobili puno ime domene uključujući poddomene
Uzorak : (?: https?\: