Regex za izdvajanje nizova u Excelu (jedno ili sve podudaranje)

  • Podijeli Ovo
Michael Brown

U ovom vodiču naučit ćete kako koristiti regularne izraze u programu Excel za pronalaženje i izdvajanje podnizova koji odgovaraju danom uzorku.

Microsoft Excel nudi niz funkcija za izdvajanje teksta iz stanica. Te se funkcije mogu nositi s većinom izazova izdvajanja nizova u vašim radnim listovima. Većina, ali ne svi. Kada se tekstualne funkcije 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 vlastite :)

    Excel VBA Regex funkcija za izdvajanje nizova

    Da biste dodali prilagođenu funkciju Regex Extract u svoj Excel, zalijepite sljedeći kod u VBA editor. Kako bismo omogućili regularne izraze u VBA-u, koristimo ugrađeni Microsoft RegExp objekt.

    Javna funkcija 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 = "" 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 End If Set matches = regex.Execute(text) If 0 < matches.Count Then If (0 = instance_num) Then ReDim text_matches(matches.Count - 1, 0) For matches_index = 0 ToVBA RegExp, potičem vas da pročitate sljedeći dio koji govori o mnogo moćnijim .NET Regex funkcijama.

    Prilagođena .NET Regex funkcija za izdvajanje teksta u Excelu

    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 s Perl 5. Ovaj vas članak neće naučiti kako napisati takve funkcije (ja nisam programer i nemam pojma kako to učiniti :)

    Četiri snažne funkcije koje obrađuje standardni .NET RegEx mehanizam već su napisali naši programeri i uključene u Ultimate Suite. U nastavku ćemo pokazati neke praktične upotrebe funkcije posebno dizajnirane za izdvajanje teksta u Excelu.

    Savjet. Za informacije o sintaksi .NET Regex, pogledajte .NET Regular Expression Language.

    Kako izvući opomene u Excelu pomoću regularnih izraza

    Pod pretpostavkom da imate instaliranu najnoviju verziju Ultimate Suitea, izdvajanje teksta pomoću regularnih izraza svodi se na ova dva koraka:

    1. Na kartici Ablebits Data , u grupi Text kliknite Regex Tools .
    2. U oknu Regex Tools odaberite izvorne podatke, unesite svoj Regex uzorak i odaberite opciju Extract . Da biste dobili rezultat kao prilagođenu funkciju, a ne vrijednost, odaberite kvačicu Umetni kao formulu kutija. Kada završite, kliknite gumb Extract .

    Rezultati će se pojaviti u novom stupcu desno od vaših izvornih podataka:

    Sintaksa AblebitsRegexExtract

    Naša prilagođena funkcija ima sljedeću sintaksu:

    AblebitsRegexExtract(referenca, regular_expression)

    Gdje:

    • Referenca (obavezno) - referenca na ćeliju koja sadrži izvorni niz.
    • Regular_expression (obavezno) - uzorak regularnog izraza za podudaranje.

    Važna napomena! Funkcija radi samo na strojevima s instaliranim Ultimate Suite for Excel.

    Napomene o korištenju

    Kako bi vaša krivulja učenja bila lakša, a iskustvo ugodnijim, obratite pozornost na ove točke:

    1. Da biste izradili formulu, možete koristiti naše Alate za regularne izraze ili dijaloški okvir Umetni funkciju programa Excel ili upišite puni naziv funkcije u ćeliju. Nakon što je formula umetnuta, možete njome upravljati (uređivati, kopirati ili premještati) kao bilo kojom izvornom formulom.
    2. Uzorak koji unesete u okno Regex Tools ide na 2. argument. Također je moguće zadržati regularni izraz u zasebnoj ćeliji. U ovom slučaju, samo upotrijebite referencu ćelije za 2. argument.
    3. Funkcija izdvaja prvo pronađeno podudaranje .
    4. Prema zadanim postavkama, funkcija je velika i mala slova -osjetljiv . Za podudaranje bez obzira na velika i mala slova upotrijebite uzorak (?i).
    5. Ako se podudaranje ne pronađe, prikazuje se pogreška #N/Avraćeno.

    Regularni izraz za izdvajanje niza između dva znaka

    Da biste dobili tekst između dva znaka, možete koristiti ili grupu za snimanje ili razgledavanje.

    Hajdemo recimo da želite izdvojiti tekst između zagrada. Grupa za snimanje je najlakši način.

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

    S pozitivnim pogledom iza i unaprijed, rezultat će biti točan isto.

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

    Molimo obratite pozornost da naša grupa za snimanje (.*?) izvodi lijenu pretragu za tekst između dvije zagrade - od prve [ do prve ]. Grupa za hvatanje bez upitnika (.*) napravila bi pohlepno pretraživanje i uhvatila sve od prvog [ do posljednjeg ].

    S uzorkom u A2, formula ide ovako 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 uzorak vratiti i "granične" znakove, zagrade u našem slučaju.

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

    Da se riješite zagrada, ZAMIJENITE ih praznim nizovima ("") koristeći ovu formulu:

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

    Za bolju čitljivost, koristimo zarez za razdjelnik.

    Regularni izraz za izdvajanje teksta između dva niza

    Pristup na kojem smo radiliprotumačite ga doslovno).

  • (?:[A-Za-z\d\-\.]{2,255}\.)? - grupa bez hvatanja za identifikaciju domena treće razine, četvrte razine itd., ako ih ima ( mobile u našem primjeru URL-a). U prvom obrascu, postavlja se unutar veće grupe za snimanje kako bi se sve takve poddomene uključile u ekstrakciju. Poddomena može biti dugačka od 2 do 255 znakova, stoga {2,255} kvantifikator.
  • ([A-Za-z\d\-]{1,63}\.[A-Za-z] {2,24}) - grupa za snimanje za izdvajanje domene druge razine ( ablebits ) i domene najviše razine ( com ). Maksimalna duljina domene druge razine je 63 znaka. Najduža vršna domena koja trenutno postoji sadrži 24 znaka.
  • Ovisno o tome koji je regularni izraz unesen u A2, formula u nastavku će dati različite rezultate:

    =AblebitsRegexExtract(A5, $A$2)

    Regex za izdvajanje punog naziva domene sa svim poddomenama:

    Regularni izraz za izdvajanje druge razine domene bez poddomena:

    Evo kako izvući dijelove teksta u Excelu pomoću regularnih izraza. Zahvaljujem vam na čitanju i radujem se što ćemo vas vidjeti na našem blogu sljedeći tjedan!

    Dostupna preuzimanja

    Excel Regex Extract primjeri (.xlsm datoteka)

    Ultimate Suite probna verzija (.exe datoteka)

    \b(0?[0-9]matches.Count - 1 text_matches(matches_index, 0) = matches.Item(matches_index) Next matches_index RegExpExtract = text_matches Else RegExpExtract = matches.Item(instance_num - 1) End If End If Exit Function ErrHandl: RegExpExtract = CVErr(xlErrValue) End Function

    Ako imate malo iskustva s VBA, korisnički vodič korak po korak mogao bi vam pomoći: Kako umetnuti VBA kod u Excel.

    Napomena. Da bi funkcija radila, svakako spremite datoteku kao radnu knjigu s omogućenim makronaredbama (.xlsm).

    Sintaksa RegExpExtract

    Funkcija RegExpExtract pretražuje ulazni niz za vrijednostima koje se podudaraju s regularnim izrazom i izdvaja jedno ili sva podudaranja.

    Funkcija ima sljedeću sintaksu :

    RegExpExtract(text, pattern, [instance_num], [match_case])

    Gdje:

    • Text (obavezno) - tekstualni niz za pretraživanje.
    • Uzorak (obavezno) - regularni izraz za podudaranje. Kada se navodi izravno u formuli, uzorak treba biti u dvostrukim navodnicima.
    • Instance_num (neobavezno) - serijski broj koji označava koju instancu treba izdvojiti. Ako je izostavljeno, vraća sva pronađena podudaranja (zadano).
    • Match_case (neobavezno) - definira hoće li se podudarati ili zanemariti velika i mala slova teksta. Ako je TRUE ili izostavljeno (zadano), izvodi se uparivanje koje razlikuje velika i mala slova; ako je FALSE - neosjetljivo je 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 RegExpExtractu

    Da biste učinkovito koristili funkciju u svom Excelu, potrebno je obratiti pozornost na nekoliko važnih stvari:

    1. Prema zadanim postavkama, funkcija vraća sva pronađena podudaranja u susjedne ćelije kao što je prikazano u ovom primjeru. Da biste dobili određeno pojavljivanje, dostavite odgovarajući broj argumentu instance_num .
    2. 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 ograničenja VBA, konstrukcija koja ne razlikuje velika i mala slova (?i) neće raditi.
    3. Ako važeći uzorak nije pronađen , funkcija ne vraća ništa (prazan niz).
    4. Ako je uzorak nevažeći , #VALUE! dolazi do pogreške.

    Prije nego počnete koristiti ovu prilagođenu funkciju u svojim radnim listovima, morate razumjeti za što je 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 (Microsoft 365 i Excel 2021) i tradicionalnom Excelu (2019 i starije verzije).

    Napomena. Naši primjeri regularnih izraza napisani su za vrlo jednostavne skupove podataka. Ne možemo jamčiti da će besprijekorno funkcionirati u vašim stvarnim radnim listovima. Oni koji imaju iskustva s regularnim izrazom složit će se da je pisanje regularnih izraza beskrajan put do savršenstva - gotovo uvijek postoji načinelegantniji je ili sposobniji za rukovanje širim rasponom ulaznih podataka.

    Regularni izraz za izdvajanje broja iz niza

    Slijedeći osnovnu maksimu podučavanja "od jednostavnog prema složenom", počet ćemo s vrlo jednostavnim slučajem: izdvajanje broja iz niza.

    prva stvar za vas je odlučiti koji broj ćete dohvatiti: prvi, zadnji, određeno pojavljivanje ili sve brojeve.

    Izdvojite prvi broj

    Ovo je jednostavno koliko regex može biti. S obzirom da \d znači bilo koju znamenku od 0 do 9, a + znači jedan ili više puta, naš regularni izraz ima ovaj oblik:

    Uzorak : \d+

    Set instance_num do 1 i dobit ćete željeni rezultat:

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

    Gdje je A5 izvorni niz.

    Za praktičnost, možete unijeti uzorak u unaprijed definiranoj ćeliji ($A$2 ) i zaključajte njegovu adresu znakom $:

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

    Dohvati zadnji broj

    Za izdvajanje posljednjeg broja u nizu , evo uzorka koji treba koristiti:

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

    Prevedeno na ljudski jezik , kaže: pronađite broj iza kojeg (nigdje, ne samo odmah) ne slijedi nijedan drugi broj. Da bismo to izrazili, koristimo negativni pogled unaprijed (?!.*\d), što znači da s desne strane uzorka ne bi smjela biti druga znamenka (\d) bez obzira na to koliko je drugih znakova prije nje.

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

    Savjeti:

    • Da biste dobili određeno pojavljivanje , koristite \d+ za uzorak i odgovarajući serijski brojbroj za instance_num .
    • Formula za izdvajanje svih brojeva raspravlja se u sljedećem primjeru.

    Regex za izdvajanje svih podudaranja

    Gurajuć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 se opcijskim instance_num argument. Zadana postavka je sva podudaranja, tako da jednostavno izostavite ovaj parametar:

    =RegExpExtract(A2, "\d+")

    Formula lijepo radi za jednu ćeliju, ali se ponašanje razlikuje u Dynamic Array Excel i nedinamičkim verzijama.

    Excel 365 i Excel 2021

    Zbog podrške za dinamičke nizove, regularna formula automatski se prelijeva u onoliko ćelija koliko je potrebno za prikaz svih izračunatih rezultata. U smislu Excela, to se naziva razliveni raspon:

    Excel 2019 i niži

    U preddinamičkom Excelu gornja bi formula vratila samo jedno podudaranje. Da biste dobili više podudaranja, morate to učiniti formulom polja. Za to odaberite raspon ćelija, upišite formulu i pritisnite Ctrl + Shift + Enter da biste je dovršili.

    Nedostatak ovog pristupa je hrpa #N/A pogreš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).

    Izdvoj sva podudaranja u jednoj ćeliji

    Prilikom obrade stupca podataka, gornji pristup očito neće funkcionirati. U ovom slučaju idealno rješenjevraćao bi sve podudarnosti u jednoj ćeliji. Da biste to učinili, poslužite rezultate RegExpExtracta funkciji TEXTJOIN i odvojite ih bilo kojim graničnikom koji želite, recimo zarezom i razmakom:

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

    Napomena. Budući da je funkcija TEXTJOIN dostupna samo u programu Excel za Microsoft 365, Excel 2021 i Excel 2019, formula neće raditi u starijim verzijama.

    Regex za izdvajanje teksta iz niza

    Izdvajanje teksta iz alfanumerički niz prilično je izazovan zadatak u Excelu. Uz regex, to postaje jednostavno kao pita. Samo koristite negiranu klasu za podudaranje svega što nije znamenka.

    Uzorak : [^\d]+

    Za dobivanje podnizova u pojedinačnim ćelijama (raspon prelijevanja) , formula je:

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

    Da biste ispisali sva podudaranja u jednu ćeliju, ugniježdite funkciju RegExpExtract u TEXTJOIN ovako:

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

    Regex to izdvojiti adresu e-pošte iz niza

    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.

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

    Razlaganje ovog regularnog izraza , evo što dobivamo:

    • [\w\.\-]+ je korisničko ime koje može uključivati ​​1 ili više alfanumeričkih znakova, podvlaka, točaka i crtica.
    • @ simbol
    • [A-Za-z0-9\.\-]+ je naziv domene koji se sastoji od: velikih i malih slova, znamenki, crtica i točaka (u slučajupoddomena). Podvlake ovdje nisu dopuštene, 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, znamenki ili podvlaci.
    • \.[A-Za-z ]{2,24} je domena najviše razine. Sastoji se od točke iza koje slijede velika i mala slova. Većina domena najviše razine sastoji se od 3 slova (npr. .com .org, .edu itd.), ali u teoriji može sadržavati od 2 do 24 slova (najduži registrirani TLD).

    Pod pretpostavkom da je niz u A5, a uzorak u A2, formula za izdvajanje adrese e-pošte je:

    =RegExpExtract(A5, $A$2)

    Regex za izdvajanje domene iz e-pošte

    Kada je dođe do izdvajanja domene e-pošte, prva pomisao koja pada na pamet je upotreba grupe za snimanje za pronalaženje teksta koji odmah slijedi znak @.

    Uzorak : @([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:

    Kod klasičnih regularnih izraza, sve izvan grupe za hvatanje nije uključeno u ekstrakciju. Nitko ne zna zašto VBA RegEx radi drugačije i hvata i "@". Da biste ga se riješili, možete ukloniti prvi znak iz rezultata tako da ga zamijenite praznim nizom.

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

    Regularni izraz za izdvajanje telefonskih brojeva

    Telefonski brojevi može se napisati na mnogo različitih načina, zbog čega je gotovo nemoguće doći do rješenja koje funkcionira pod svima(\d{4}iz niza

    Regularni izraz za izdvajanje datuma ovisi o formatu u kojem se datum pojavljuje unutar niza. Na primjer:

    Za izdvajanje datuma poput 1/1/21 ili 01/01/2021, regularni izraz je: \d{1,2}\/\d{1,2}\/(\d {4}okolnosti. Unatoč tome, možete zapisati sve formate koji se koriste u vašem skupu podataka i pokušati ih uskladiti.

    Za ovaj primjer, izradit ćemo regularni izraz koji će izdvojiti telefonske brojeve u bilo kojem od ovih formata:

    (123) 345-6789

    (123) 345 6789

    (123)3456789

    123- 345-6789

    123.345.6789

    123 345 6789

    1233456789

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

    • Prvi dio \(?\d{3} odgovara nuli ili jednoj otvarajućoj zagradi iza koje slijede tri znamenke d{3}.
    • Dio [-\. \)]* znači bilo koji znak u uglatim zagradama koji se pojavljuje 0 ili više puta: crtica, točka, razmak ili zatvorena zagrada.
    • Dalje, ponovno imamo tri znamenke d{3} iza kojih slijedi bilo koju crticu, točku ili razmak [-\. ]? pojavljuju se 0 ili 1 put.
    • Nakon toga, slijedi grupa od četiri znamenke \d{4}.
    • Na kraju, postoji granica riječi \b koja definira da je 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 regularni izraz može vratiti nekoliko lažno pozitivni rezultati kao što su 123) 456 7899 ili (123 456 7899. Donja verzija rješava te probleme. Međutim, ova sintaksa radi samo u funkcijama VBA RegExp, ne i u klasičnim regularnim izrazima.

    Uzorak : (\(\d{3}\)out za izvlačenje teksta između dva znaka također će raditi za izdvajanje teksta između dva niza.

    Na primjer, da dobijete 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 s regularnim izrazima, izdvajanje naziva domena iz URL-ova nije trivijalan zadatak. Ključni element koji radi trik su grupe koje ne mogu uhvatiti. Ovisno o vašem krajnjem cilju, odaberite jedan od donjih regularnih izraza.

    Da biste dobili puni naziv domene uključujući poddomene

    Uzorak : (?: https?\:

    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.