INHOUDSOPGAWE
In hierdie tutoriaal sal jy leer hoe om gereelde uitdrukkings in Excel te gebruik om substringe te vind en te onttrek wat by 'n gegewe patroon pas.
Microsoft Excel verskaf 'n aantal funksies om teks te onttrek van selle. Daardie funksies kan die meeste van die string-onttrekkingsuitdagings in jou werkblaaie hanteer. Meeste, maar nie almal nie. Wanneer die teksfunksies struikel, kom gereelde uitdrukkings tot redding. Wag ... Excel het geen RegEx-funksies nie! True, geen ingeboude funksies nie. Maar daar is niks wat jou sal verhoed om jou eie te gebruik nie :)
Excel VBA Regex-funksie om stringe te onttrek
Om 'n pasgemaakte Regex-uittrekselfunksie by jou Excel te voeg, plak die volgende kode in die VBA-redigeerder. Om gereelde uitdrukkings in VBA te aktiveer, gebruik ons die ingeboude Microsoft RegExp-objek.
Publieke funksie 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 Heelgetal Met Fout Gaan na ErrHandl RegExpExtract = "" Stel regex = CreateObject ( "VBScript.RegExp") regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case Dan regex. ignorecase = Onwaar Anders regex.ignorecase = Ware Einde As Stel pas = 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, ek moedig jou aan om die volgende deel te lees wat baie kragtiger .NET RegEx-funksies bespreek.Gepasmaakte .NET-gebaseerde Regex-funksie om teks in Excel te onttrek
Anders as VBA RegExp-funksies wat geskryf kan word deur enige Excel-gebruiker, .NET RegEx is die ontwikkelaar se ryk. Die Microsoft .NET Framework ondersteun gereelde uitdrukkingsintaksis wat versoenbaar is met Perl 5. Hierdie artikel sal jou nie leer hoe om sulke funksies te skryf nie (ek is nie 'n programmeerder nie en het nie 'n minste idee hoe om dit te doen nie :)
Vier kragtige funksies wat deur die standaard .NET RegEx-enjin verwerk word, is reeds deur ons ontwikkelaars geskryf en ingesluit in Ultimate Suite. Hieronder sal ons 'n paar praktiese gebruike van die funksie demonstreer wat spesiaal ontwerp is om teks in Excel te onttrek.
Wenk. Vir inligting oor die .NET Regex-sintaksis, verwys asseblief na .NET Regular Expression Language.
Hoe om steke in Excel te onttrek deur gebruik te maak van gereelde uitdrukkings
Gestel jy het die nuutste weergawe van Ultimate Suite geïnstalleer, kom die onttrekking van teks met behulp van gewone uitdrukkings op hierdie twee stappe neer:
- Op die Ablebits Data -oortjie, in die Teks -groep, klik Regex Tools .
- Op die Regex Tools -paneel, kies die brondata, voer jou Regex-patroon in en kies die Extract -opsie. Om die resultaat as 'n pasgemaakte funksie te kry, nie 'n waarde nie, kies die Voeg in as 'n formule -merkboks. Wanneer jy klaar is, klik die Uittreksel -knoppie.
Die resultate sal in 'n nuwe kolom regs van jou oorspronklike data verskyn:
AblebitsRegexExtract-sintaksis
Ons pasgemaakte funksie het die volgende sintaksis:
AblebitsRegexExtract(verwysing, gereelde_uitdrukking)Waar:
- Verwysing (vereis) - 'n verwysing na die sel wat die bronstring bevat.
- Gereelde_uitdrukking (vereis) - die regekspatroon om te pas.
Belangrike nota! Die funksie werk net op die masjiene met Ultimate Suite for Excel geïnstalleer.
Gebruiknotas
Om jou leerkurwe gladder en jou ervaring aangenamer te maak, let asseblief op hierdie punte:
- Om 'n formule te skep, kan jy ons Regex Tools gebruik, of Excel se Voeg funksie in dialoog, of die volle funksienaam in 'n sel tik. Sodra die formule ingevoeg is, kan jy dit bestuur (redigeer, kopieer of skuif) soos enige inheemse formule.
- Die patroon wat jy in die Regex Tools -paneel invoer, gaan na die 2de argument. Dit is ook moontlik om 'n gereelde uitdrukking in 'n aparte sel te hou. In hierdie geval, gebruik net 'n selverwysing vir die 2de argument.
- Die funksie onttrek die eerste gevind pasmaat .
- By verstek is die funksie hoofletters -sensitief . Vir hoofletter-onsensitiewe passing, gebruik die (?i)-patroon.
- As 'n passing nie gevind word nie, is 'n #N/A-foutteruggestuur.
Regex om string tussen twee karakters te onttrek
Om teks tussen twee karakters te kry, kan jy óf 'n vasvanggroep óf rondkyk gebruik.
Kom ons sê jy soek teks tussen hakies. 'n Vang groep is die maklikste manier.
Patroon 1 : \[(.*?)\]
Met 'n positiewe kyk agter en vooruit, sal die resultaat presies wees dieselfde.
Patroon 2 : (?<=\[)(.*?)(?=\])
Let asseblief daarop dat ons vasvanggroep (.*?) voer 'n lui soek na teks tussen twee hakies - van die eerste [ tot die eerste ]. 'n Vanggroep sonder 'n vraagteken (.*) sal 'n gierige soektog doen en alles van die eerste [ tot die laaste ] vasvang.
Met die patroon in A2 gaan die formule soos volg:
=AblebitsRegexExtract(A5, $A$2)
Hoe om alle passings te kry
Soos reeds genoem, kan die AblebitsRegexExtract-funksie net een passing onttrek. Om alle wedstryde te kry, kan jy die VBA-funksie gebruik wat ons vroeër bespreek het. Daar is egter een waarskuwing - VBA RegExp ondersteun nie vaslegging van groepe nie, so die bogenoemde patroon sal die "grens" karakters ook terugstuur, hakies in ons geval.
=TEXTJOIN(" ", TRUE, RegExpExtract(A5, $A$2))
Om ontslae te raak van die hakies, VERVANG hulle met leë stringe ("") deur hierdie formule te gebruik:
=SUBSTITUTE(SUBSTITUTE(TEXTJOIN(", ", TRUE, RegExpExtract(A5, $A$2)), "]", ""),"[","")
Vir beter leesbaarheid, gebruik ons 'n komma vir skeiding.
Regex om teks tussen twee stringe te onttrek
Die benadering wat ons gewerk hetinterpreteer dit letterlik).
Afhangende van watter gewone uitdrukking in A2 ingevoer word, sal die onderstaande formule verskillende resultate lewer:
=AblebitsRegexExtract(A5, $A$2)
Regex om die volle domeinnaam met alle subdomeine te onttrek:
Regex om 'n tweedevlak domein sonder subdomeine te onttrek:
Dit is hoe om dele van teks in Excel te onttrek deur gebruik te maak van gewone uitdrukkings. Ek bedank jou vir die lees en sien uit daarna om jou volgende week op ons blog te sien!
Beskikbare aflaaie
Excel Regex Extract-voorbeelde (.xlsm-lêer)
Ultimate Suite-proefweergawe (.exe-lêer)
\b(0?[0-9]matches.Count - 1 text_matches(matches_index, 0) = matches.Item(matches_index) Volgende matches_index RegExpExtract = text_matches Else RegExpExtract = matches.Item(instance_num - 1) End If End If Exit Funksie ErrHandl: RegExpExtract = CVErction(xlEr) EndAs jy min ervaring met VBA het, kan 'n stap-vir-stap gebruikersgids nuttig wees: Hoe om VBA-kode in Excel in te voeg.
Let wel. Vir die funksie om te werk, maak seker dat jy jou lêer stoor as 'n makro-geaktiveerde werkboek (.xlsm).
RegExpExtract-sintaksis
Die RegExpExtract -funksie soek 'n invoerstring vir waardes wat by 'n gewone uitdrukking pas en onttrek een of alle passings.
Die funksie het die volgende sintaksis :
RegExpExtract(text, pattern, [instance_num], [match_case])Waar:
- Teks (vereis) - die teksstring om in te soek.
- Patroon (vereis) - die gereelde uitdrukking om te pas. Wanneer dit direk in 'n formule verskaf word, moet die patroon in dubbele aanhalingstekens ingesluit word.
- Instance_num (opsioneel) - 'n reeksnommer wat aandui watter instansie onttrek moet word. As dit weggelaat word, gee alle gevind passings terug (verstek).
- Password_case (opsioneel) - definieer of teksletters pas of ignoreer. Indien WAAR of weggelaat (verstek), word hooflettergevoelige passing uitgevoer; indien ONWAAR - hoofletter-onsensitief.
Die funksie werk in alle weergawes van Excel 365, Excel 2021, Excel2019, Excel 2016, Excel 2013 en Excel 2010.
4 dinge wat jy moet weet oor RegExpExtract
Om die funksie effektief in jou Excel te gebruik, is daar 'n paar belangrike dinge om van kennis te neem:
- By verstek gee die funksie alle gevind passings terug in naburige selle soos in hierdie voorbeeld getoon. Om 'n spesifieke voorkoms te kry, verskaf 'n ooreenstemmende nommer aan die geval_nommer argument.
- By verstek is die funksie hooflettergevoelig . Vir hoofletter-onsensitiewe passing, stel die passing_case -argument op FALSE. As gevolg van die VBA-beperkings, sal die hoofletter-onsensitiewe konstruk (?i) nie werk nie.
- As 'n geldige patroon nie gevind word nie , gee die funksie niks terug nie (leë string).
- As die patroon ongeldig is , 'n #WAARDE! fout kom voor.
Voordat jy hierdie pasgemaakte funksie in jou werkblaaie begin gebruik, moet jy verstaan waartoe dit in staat is, of hoe? Die onderstaande voorbeelde dek 'n paar algemene gebruiksgevalle en verduidelik waarom die gedrag kan verskil in Dynamic Array Excel (Microsoft 365 en Excel 2021) en tradisionele Excel (2019 en ouer weergawes).
Let wel. Regex-voorbeelde word geskryf vir redelik eenvoudige datastelle. Ons kan nie waarborg dat hulle foutloos in u regte werkkaarte sal werk nie. Diegene wat ondervinding het met regex sal saamstem dat die skryf van gereelde uitdrukkings 'n nimmereindigende pad na perfeksie is - byna altyd is daar 'n manier om te maakdit is meer elegant of in staat om 'n wyer reeks invoerdata te hanteer.
Regex om getal uit string te onttrek
Na aanleiding van die basiese beginsel van onderrig "van eenvoudig tot kompleks", begin ons met 'n baie eenvoudige hoofletter: onttrek nommer uit string.
Die eerste ding wat jy moet besluit, is watter nommer om te haal: eerste, laaste, spesifieke voorkoms of alle getalle.
Onttrek eerste nommer
Dit is so eenvoudig as wat regeks kan kry. Aangesien \d enige syfer van 0 tot 9 beteken, en + een of meer kere beteken, neem ons gereelde uitdrukking hierdie vorm aan:
Patroon : \d+
Stel instance_num tot 1 en jy sal die gewenste resultaat kry:
=RegExpExtract(A5, "\d+", 1)
Waar A5 die oorspronklike string is.
Geriefshalwe kan jy invoer die patroon in 'n voorafbepaalde sel ($A$2 ) en sluit sy adres met die $-teken:
=RegExpExtract(A5, $A$2, 1)
Kry laaste nommer
Om die laaste nommer in 'n string te onttrek , hier is die patroon om te gebruik:
Patroon : (\d+)(?!.*\d)
Vertaal in 'n menslike taal , dit sê: vind 'n nommer wat nie (enige plek, nie net onmiddellik) deur enige ander nommer gevolg word nie. Om dit uit te druk, gebruik ons 'n negatiewe vooruitkyk (?!.*\d), wat beteken dat daar regs van die patroon geen ander syfer (\d) moet wees nie, ongeag hoeveel ander karakters daarvoor is.
=RegExpExtract(A5, "(\d+)(?!.*\d)")
Wenke:
- Om 'n spesifieke voorkoms te kry, gebruik \d+ vir patroon en 'n toepaslike reeksnommer vir getal_nommer .
- Die formule om alle getalle te onttrek word in die volgende voorbeeld bespreek.
Regex om alle passings te onttrek
Om ons voorbeeld 'n bietjie verder te druk, veronderstel jy wil alle getalle van 'n string af kry, nie net een nie.
Soos jy dalk onthou, word die aantal onttrekte passings beheer deur die opsionele instance_num argument. Die verstek is alle passings, so jy laat eenvoudig hierdie parameter weg:
=RegExpExtract(A2, "\d+")
Die formule werk pragtig vir 'n enkele sel, maar die gedrag verskil in Dynamic Array Excel en nie-dinamiese weergawes.
Excel 365 en Excel 2021
As gevolg van ondersteuning vir dinamiese skikkings, mors 'n gereelde formule outomaties in soveel selle as wat nodig is om alle berekende resultate te vertoon. In terme van Excel, word dit 'n uitgestorte reeks genoem:
Excel 2019 en laer
In pre-dinamiese Excel sal die formule hierbo net een passing gee. Om veelvuldige passings te kry, moet jy dit 'n skikkingsformule maak. Kies hiervoor 'n reeks selle, tik die formule in en druk Ctrl + Shift + Enter om dit te voltooi.
'n Nadeel van hierdie benadering is 'n klomp #N/A-foute wat in "ekstra selle" verskyn . Ongelukkig kan niks daaraan gedoen word nie (nie IFERROR of IFNA kan dit regmaak nie, helaas).
Onttrek alle passings in een sel
Wanneer 'n kolom met data verwerk word, sal die bogenoemde benadering natuurlik nie werk nie. In hierdie geval, 'n ideale oplossingsal alle wedstryde in 'n enkele sel terugstuur. Om dit te laat doen, bedien die resultate van RegExpExtract aan die TEXTJOIN-funksie en skei hulle met enige skeidingsteken wat jy wil, sê 'n komma en 'n spasie:
=TEXTJOIN(", ", TRUE, RegExpExtract(A5, "\d+"))
Let wel. Omdat die TEXTJOIN-funksie slegs in Excel vir Microsoft 365, Excel 2021 en Excel 2019 beskikbaar is, sal die formule nie in ouer weergawes werk nie.
Regex om teks uit string te onttrek
Onttrek teks uit 'n alfanumeriese string is nogal 'n uitdagende taak in Excel. Met regex word dit so maklik soos ’n koek. Gebruik net 'n ontkende klas om alles te pas wat nie 'n syfer is nie.
Patroon : [^\d]+
Om substringe in individuele selle te kry (morsreeks) , die formule is:
=RegExpExtract(A5, "[^\d]+")
Om alle passings in een sel uit te voer, nes die RegExpExtract-funksie in TEXTJOIN soos volg:
=TEXTJOIN("", TRUE, RegExpExtract(A5, "[^\d]+"))
Regex to onttrek e-posadres uit string
Om 'n e-posadres uit 'n string te trek wat baie verskillende inligting bevat, skryf 'n gewone uitdrukking wat die e-posadresstruktuur herhaal.
Patroon : [\w\.\-]+@[A-Za-z0-9\.\-]+\.[A-Za-z]{2,24}
Opbreek hierdie regeks , hier is wat ons kry:
- [\w\.\-]+ is 'n gebruikernaam wat 1 of meer alfanumeriese karakters, onderstrepings, kolletjies en koppeltekens kan insluit.
- @-simbool
- [A-Za-z0-9\.\-]+ is 'n domeinnaam wat bestaan uit: hoofletters en kleinletters, syfers, koppeltekens en kolletjies (in gevalvan subdomeine). Onderstrepe word nie hier toegelaat nie, daarom word 3 verskillende karakterstelle (soos A-Z a-z en 0-9) gebruik in plaas van \w wat by enige letter, syfer of onderstreep pas.
- \.[A-Za-z ]{2,24} is 'n topvlakdomein. Bestaan uit 'n punt gevolg deur hoofletters en kleinletters. Die meeste topvlakdomeine is 3-letters lank (bv. .com .org, .edu, ens.), maar in teorie kan dit van 2 tot 24 letters bevat (die langste geregistreerde TLD).
As die string in A5 en die patroon in A2 is, is die formule om 'n e-posadres te onttrek:
=RegExpExtract(A5, $A$2)
Regex om domein uit e-pos te onttrek
Wanneer dit kom by die onttrekking van e-posdomein, is die eerste gedagte wat by my opkom om 'n vasvanggroep te gebruik om teks te vind wat onmiddellik op die @-karakter volg.
Patroon : @([A-Za-z0 -9\.\-]+\.[A-Za-z]{2,24})
Bedien dit aan ons RegExp-funksie:
=RegExpExtract(A5, "@([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})")
En jy sal hierdie resultaat kry:
Met klassieke gereelde uitdrukkings word enigiets buite 'n vasvanggroep nie by die onttrekking ingesluit nie. Niemand weet hoekom VBA RegEx anders werk en "@" ook vasvang nie. Om daarvan ontslae te raak, kan jy die eerste karakter uit die resultaat verwyder deur dit met 'n leë string te vervang.
=REPLACE(RegExpExtract(A5, "@([a-z\d][a-z\d\-\.]*\.[a-z]{2,})", 1, FALSE), 1, 1, "")
Gereelde uitdrukking om telefoonnommers te onttrek
Foonnommers kan op baie verskillende maniere geskryf word, en daarom is dit byna onmoontlik om met 'n oplossing vorendag te kom wat onder almal werk(\d{4}vanaf string
'n Gereelde uitdrukking vir die onttrekking van 'n datum hang af van die formaat waarin die datum binne 'n string verskyn. Byvoorbeeld:
Om datums soos 1/1/21 of 01/01/2021 te onttrek, is die regeks: \d{1,2}\/\d{1,2}\/(\d {4}omstandighede. Nietemin, jy kan al die formate wat in jou datastel gebruik word neerskryf en probeer om hulle te pas.
Vir hierdie voorbeeld gaan ons 'n regeks skep wat telefoonnommers in enige van hierdie formate sal onttrek:
(123) 345-6789 (123) 345 6789 (123)3456789 123- 345-6789 | 123.345.6789 123 345 6789 1233456789 |
Patroon : \(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b
- Die eerste deel \(?\d{3} pas by nul of een openingshakies gevolg deur drie syfers d{3}.
- Die [-\. \)]* deel beteken enige karakter tussen vierkantige hakies wat 0 of meer keer voorkom: koppelteken, punt, spasie of sluithakies.
- Volgende het ons weer drie syfers d{3} gevolg deur enige koppelteken, punt of spasie [-\. ]? verskyn 0 of 1 keer.
- Daarna is daar 'n groep van vier syfers \d{4}.
- Laastens is daar 'n woordgrens \b wat definieer dat 'n telefoonnommer ons is soek na kan nie deel van 'n groter getal wees nie.
Die volledige formule neem hierdie vorm aan:
=RegExpExtract(A5, "\(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b")
Wees asseblief bewus daarvan dat die regeks hierbo 'n paar kan gee vals-positiewe resultate soos 123) 456 7899 of (123 456 7899. Die onderstaande weergawe stel hierdie probleme reg. Hierdie sintaksis werk egter net in VBA RegExp-funksies, nie in klassieke gereelde uitdrukkings nie.
Patroon : (\(\d{3}\)uit om teks tussen twee karakters uit te trek, sal ook werk om teks tussen twee stringe te onttrek.
Om byvoorbeeld alles tussen "toets 1" en "toets 2" te kry, gebruik die volgende gereelde uitdrukking.
Patroon : toets 1(.*?)toets 2
Die volledige formule is:
=AblebitsRegexExtract(A5, "test 1(.*?)test 2")
Regex om domein uit URL te onttrek
Selfs met gereelde uitdrukkings is die onttrekking van domeinname van URL's nie 'n onbenullige taak nie. Die sleutelelement wat die truuk doen, is om groepe nie vas te vang nie. Afhangende van jou uiteindelike doelwit, kies een van die onderstaande regekse.
Om 'n volle domeinnaam te kry, insluitend subdomeine
patroon : (?: https?\: