Regex for å trekke ut strenger i Excel (en eller alle treff)

  • Dele Denne
Michael Brown

I denne opplæringen lærer du hvordan du bruker regulære uttrykk i Excel for å finne og trekke ut delstrenger som samsvarer med et gitt mønster.

Microsoft Excel har en rekke funksjoner for å trekke ut tekst fra celler. Disse funksjonene kan takle de fleste strengutvinningsutfordringer i regnearkene dine. De fleste, men ikke alle. Når tekstfunksjonene snubler, kommer regulære uttrykk til unnsetning. Vent... Excel har ingen RegEx-funksjoner! Riktignok ingen innebygde funksjoner. Men det er ingenting som hindrer deg i å bruke dine egne :)

    Excel VBA Regex-funksjon for å trekke ut strenger

    For å legge til en tilpasset Regex Extract-funksjon til Excel, lim inn følgende kode i VBA-editoren. For å aktivere regulære uttrykk i VBA, bruker vi det innebygde Microsoft RegExp-objektet.

    Offentlig funksjon RegExpExtract(tekst Som String , pattern As String , Optional instance_num As Integer = 0, Optional match_case As Boolean = True ) Dim text_matches() As String Dim matches_index Som heltall ved feil Gå til ErrHandl RegExpExtract = "" Sett regex = CreateObject ( "VBScript.RegExp") regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case Deretter 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, jeg oppfordrer deg til å lese den neste delen som diskuterer mye kraftigere .NET Regex-funksjoner.

    Tilpasset .NET-basert Regex-funksjon for å trekke ut tekst i Excel

    I motsetning til VBA RegExp-funksjoner som kan skrives av enhver Excel-bruker, .NET RegEx er utviklerens rike. Microsoft .NET Framework støtter fullfunksjons syntaks for regulære uttrykk som er kompatibel med Perl 5. Denne artikkelen vil ikke lære deg hvordan du skriver slike funksjoner (jeg er ikke en programmerer og har ingen anelse om hvordan du gjør det :)

    Fire kraftige funksjoner behandlet av standard .NET RegEx-motoren er allerede skrevet av våre utviklere og inkludert i Ultimate Suite. Nedenfor vil vi demonstrere noen praktiske bruksområder for funksjonen spesielt utviklet for å trekke ut tekst i Excel.

    Tips. For informasjon om .NET Regex-syntaksen, se .NET Regular Expression Language.

    Hvordan trekke ut stings i Excel ved hjelp av regulære uttrykk

    Forutsatt at du har den nyeste versjonen av Ultimate Suite installert, koker uttrekking av tekst ved hjelp av regulære uttrykk ned til disse to trinnene:

    1. Ablebits Data -fanen, i Tekst -gruppen, klikk Regex-verktøy .
    2. I Regex Tools -ruten velger du kildedataene, skriver inn ditt Regex-mønster og velger alternativet Extract . For å få resultatet som en egendefinert funksjon, ikke en verdi, velg Sett inn som en formel -hakeneske. Når du er ferdig, klikker du på Pakk ut -knappen.

    Resultatene vil vises i en ny kolonne til høyre for de opprinnelige dataene dine:

    AblebitsRegexExtract syntaks

    Vår egendefinerte funksjon har følgende syntaks:

    AblebitsRegexExtract(referanse, vanlig_uttrykk)

    Hvor:

    • Referanse (påkrevd) - en referanse til cellen som inneholder kildestrengen.
    • Regular_expression (påkrevd) - regex-mønsteret som skal samsvare.

    Viktig merknad! Funksjonen fungerer kun på maskinene med Ultimate Suite for Excel installert.

    Bruksmerknader

    For å gjøre læringskurven jevnere og opplevelsen mer behagelig, vær oppmerksom på disse punktene:

    1. For å lage en formel kan du bruke Regex-verktøyene , eller Excels Sett inn funksjon -dialogboks, eller skrive inn hele funksjonsnavnet i en celle. Når formelen er satt inn, kan du administrere den (redigere, kopiere eller flytte) som en hvilken som helst naturlig formel.
    2. Mønsteret du skriver inn på Regex Tools -ruten går til det andre argumentet. Det er også mulig å beholde et regulært uttrykk i en egen celle. I dette tilfellet bruker du bare en cellereferanse for det andre argumentet.
    3. Funksjonen trekker ut først funnet samsvar .
    4. Som standard er funksjonen store bokstaver -sensitiv . For samsvar uten store og små bokstaver, bruk (?i)-mønsteret.
    5. Hvis et samsvar ikke blir funnet, er en #N/A-feilreturnert.

    Regex for å trekke ut streng mellom to tegn

    For å få tekst mellom to tegn, kan du bruke enten en fangstgruppe eller se-arounds.

    La oss si at du ønsker å trekke ut tekst mellom parenteser. En fangegruppe er den enkleste måten.

    Mønster 1 : \[(.*?)\]

    Med et positivt blikk bak og fremover vil resultatet bli nøyaktig det samme.

    Mønster 2 : (?<=\[)(.*?)(?=\])

    Vær oppmerksom på at fangegruppen vår (.*?) utfører et lat søk etter tekst mellom to parenteser - fra den første [ til den første ]. En fangegruppe uten spørsmålstegn (.*) ville gjort et grådig søk og fanget alt fra den første [ til den siste ].

    Med mønsteret i A2 går formelen som følger:

    =AblebitsRegexExtract(A5, $A$2)

    Hvordan få alle treff

    Som allerede nevnt, kan AblebitsRegexExtract-funksjonen bare trekke ut ett treff. For å få alle treff kan du bruke VBA-funksjonen vi har diskutert tidligere. Det er imidlertid ett forbehold - VBA RegExp støtter ikke fangstgrupper, så mønsteret ovenfor vil returnere "grense"-tegnene også, parentes i vårt tilfelle.

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

    For å bli kvitt av parentesene, ERSTATT dem med tomme strenger ("") ved å bruke denne formelen:

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

    For bedre lesbarhet bruker vi et komma for skilletegn.

    Regex for å trekke ut tekst mellom to strenger

    Tilnærmingen vi har jobbet medtolke det bokstavelig).

  • (?:[A-Za-z\d\-\.]{2,255}\.)? - ikke-fangstgruppe for å identifisere domener på tredje nivå, fjerde nivå osv., hvis noen ( mobil i eksempelnettadressen vår). I det første mønsteret er det plassert i en større fangstgruppe for å få alle slike underdomener inkludert i utvinningen. Et underdomene kan være fra 2 til 255 tegn langt, derav kvantifikatoren {2,255}.
  • ([A-Za-z\d\-]{1,63}\.[A-Za-z] {2,24}) - fangegruppe for å trekke ut andrenivådomenet ( ablebits ) og toppnivådomenet ( com ). Maksimal lengde på et andrenivådomene er 63 tegn. Det lengste toppnivådomenet som eksisterer for øyeblikket inneholder 24 tegn.
  • Avhengig av hvilket regulært uttrykk som er lagt inn i A2, vil formelen nedenfor gi forskjellige resultater:

    =AblebitsRegexExtract(A5, $A$2)

    Regex for å trekke ut det fulle domenenavnet med alle underdomener:

    Regex for å trekke ut et andre-nivå domene uten underdomener:

    Slik trekker du ut deler av tekst i Excel ved hjelp av regulære uttrykk. Jeg takker for at du leser og ser frem til å se deg på bloggen vår neste uke!

    Tilgjengelige nedlastinger

    Excel Regex Extract-eksempler (.xlsm-fil)

    Ultimate Suite-prøveversjon (.exe-fil)

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

    Hvis du har liten erfaring med VBA, kan en trinn-for-trinn brukerveiledning være nyttig: Slik setter du inn VBA-kode i Excel.

    Merk. For at funksjonen skal fungere, sørg for å lagre filen som en makroaktivert arbeidsbok (.xlsm).

    RegExpExtract-syntaks

    RegExpExtract -funksjonen søker etter en inndatastreng for verdier som samsvarer med et regulært uttrykk og trekker ut ett eller alle treff.

    Funksjonen har følgende syntaks :

    RegExpExtract(tekst, mønster, [instance_num], [match_case])

    Hvor:

    • Tekst (påkrevd) - tekststrengen det skal søkes i.
    • Mønster (obligatorisk) - det regulære uttrykket som skal samsvare. Når det leveres direkte i en formel, skal mønsteret omsluttes av doble anførselstegn.
    • Forekomstnummer (valgfritt) - et serienummer som indikerer hvilken forekomst som skal trekkes ut. Hvis utelatt, returnerer alle funnet treff (standard).
    • Samsvar (valgfritt) - definerer om det skal samsvare med eller ignorere store og små bokstaver i tekst. Hvis TRUE eller utelatt (standard), utføres samsvar med store og små bokstaver; hvis FALSE - skiller mellom store og små bokstaver.

    Funksjonen fungerer i alle versjoner av Excel 365, Excel 2021, Excel2019, Excel 2016, Excel 2013 og Excel 2010.

    4 ting du bør vite om RegExpExtract

    For effektivt å bruke funksjonen i Excel, er det noen viktige ting å være oppmerksom på:

    1. Som standard returnerer funksjonen alle funnet samsvar til naboceller som vist i dette eksemplet. For å få en spesifikk forekomst, oppgi et tilsvarende tall til forekomstnummer -argumentet.
    2. Som standard er funksjonen forbokstavsensitiv . For samsvaring som ikke skiller mellom store og små bokstaver, setter du tilfelle_tilfelle -argumentet til FALSE. På grunn av VBA-begrensningene vil ikke den store og små bokstav-usensitive konstruksjonen (?i) fungere.
    3. Hvis et gyldig mønster ikke blir funnet , returnerer funksjonen ingenting (tom streng).
    4. Hvis mønsteret er ugyldig , vises en #VALUE! feil oppstår.

    Før du begynner å bruke denne egendefinerte funksjonen i regnearkene dine, må du forstå hva den er i stand til, ikke sant? Eksemplene nedenfor dekker noen vanlige brukstilfeller og forklarer hvorfor virkemåten kan variere i Dynamic Array Excel (Microsoft 365 og Excel 2021) og tradisjonell Excel (2019 og eldre versjoner).

    Merk. Regex-eksempler er skrevet for ganske enkle datasett. Vi kan ikke garantere at de vil fungere feilfritt i dine ekte regneark. De som har erfaring med regex vil være enige i at å skrive regulære uttrykk er en uendelig vei til perfeksjon - nesten alltid er det en måte å gjøreden er mer elegant eller i stand til å håndtere et bredere spekter av inndata.

    Regex for å trekke ut tall fra streng

    I henhold til den grunnleggende maksimen om å lære "fra enkel til kompleks", starter vi med et veldig enkelt tilfelle: å trekke ut tall fra streng.

    det første du må bestemme er hvilket tall du skal hente: første, siste, spesifikke forekomst eller alle tall.

    Trekk ut første tall

    Dette er så enkelt som regulært uttrykk kan få. Gitt at \d betyr et hvilket som helst siffer fra 0 til 9, og + betyr en eller flere ganger, har vårt regulære uttrykk denne formen:

    Mønster : \d+

    Sett forekomstnummer til 1 og du får ønsket resultat:

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

    Hvor A5 er den opprinnelige strengen.

    For enkelhets skyld kan du skrive inn mønsteret i en forhåndsdefinert celle ($A$2 ) og lås adressen med $-tegnet:

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

    Få siste nummer

    For å trekke ut det siste tallet i en streng , her er mønsteret som skal brukes:

    Mønster : (\d+)(?!.*\d)

    Oversatt til et menneskelig språk , står det: finn et tall som ikke blir fulgt (hvor som helst, ikke bare umiddelbart) av noe annet tall. For å uttrykke dette bruker vi en negativ lookahead (?!.*\d), som betyr at til høyre for mønsteret skal det ikke være noe annet siffer (\d) uavhengig av hvor mange andre tegn som står foran det.

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

    Tips:

    • For å få en spesifikk forekomst , bruk \d+ for mønster og en passende serietall for forekomstnummer .
    • Formelen for å trekke ut alle tall diskuteres i neste eksempel.

    Regex for å trekke ut alle treff

    For å skyve eksemplet vårt litt lenger, anta at du vil hente alle tallene fra en streng, ikke bare ett.

    Som du kanskje husker, kontrolleres antallet ekstraherte treff av den valgfrie forekomstnummer argument. Standard er alle treff, så du utelater bare denne parameteren:

    =RegExpExtract(A2, "\d+")

    Formelen fungerer vakkert for en enkelt celle, men oppførselen er forskjellig i Dynamic Array Excel og ikke-dynamiske versjoner.

    Excel 365 og Excel 2021

    På grunn av støtte for dynamiske matriser vil en vanlig formel automatisk søles inn i så mange celler som er nødvendig for å vise alle beregnede resultater. Når det gjelder Excel, kalles dette et spilt område:

    Excel 2019 og lavere

    I pre-dynamisk Excel, vil formelen ovenfor bare returnere ett samsvar. For å få flere treff, må du gjøre det til en matriseformel. For dette, velg en rekke celler, skriv inn formelen og trykk Ctrl + Shift + Enter for å fullføre den.

    En ulempe med denne tilnærmingen er en haug med #N/A-feil som vises i "ekstra celler" . Dessverre kan ingenting gjøres med det (verken IFERROR eller IFNA kan fikse det, dessverre).

    Pakk ut alle treff i én celle

    Når du behandler en kolonne med data, vil tilnærmingen ovenfor åpenbart ikke fungere. I dette tilfellet en ideell løsningville returnere alle treff i en enkelt celle. For å få det gjort, server resultatene av RegExpExtract til TEXTJOIN-funksjonen og separer dem med et hvilket som helst skilletegn du liker, si et komma og et mellomrom:

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

    Merk. Fordi TEXTJOIN-funksjonen kun er tilgjengelig i Excel for Microsoft 365, Excel 2021 og Excel 2019, vil ikke formelen fungere i eldre versjoner.

    Regex for å trekke ut tekst fra streng

    Trekke ut tekst fra en alfanumerisk streng er en ganske utfordrende oppgave i Excel. Med regex blir det lett som en plett. Bare bruk en negert klasse for å matche alt som ikke er et siffer.

    Mønster : [^\d]+

    For å få delstrenger i individuelle celler (spillområde) , formelen er:

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

    For å sende ut alle treff i én celle, nester du RegExpExtract-funksjonen i TEXTJOIN slik:

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

    Regex til trekke ut e-postadresse fra streng

    For å trekke ut en e-postadresse fra en streng som inneholder mye forskjellig informasjon, skriv et regulært uttrykk som replikerer e-postadressestrukturen.

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

    Avbryte dette regulære uttrykket , her er hva vi får:

    • [\w\.\-]+ er et brukernavn som kan inneholde 1 eller flere alfanumeriske tegn, understreker, prikker og bindestreker.
    • @-symbol
    • [A-Za-z0-9\.\-]+ er et domenenavn som består av: store og små bokstaver, sifre, bindestreker og prikker (i tilfelleav underdomener). Understrek er ikke tillatt her, derfor brukes 3 forskjellige tegnsett (som A-Z a-z og 0-9) i stedet for \w som samsvarer med enhver bokstav, siffer eller understrek.
    • \.[A-Za-z ]{2,24} er et toppnivådomene. Består av en prikk etterfulgt av store og små bokstaver. De fleste toppnivådomener er 3 bokstaver lange (f.eks. .com .org, .edu osv.), men i teorien kan de inneholde fra 2 til 24 bokstaver (den lengste registrerte TLD).

    Forutsatt at strengen er i A5 og mønsteret i A2, er formelen for å trekke ut en e-postadresse:

    =RegExpExtract(A5, $A$2)

    Regex for å trekke ut domene fra e-post

    Når det kommer til å trekke ut e-postdomene, er den første tanken som dukker opp å bruke en fangegruppe for å finne tekst som umiddelbart følger @-tegnet.

    Mønster : @([A-Za-z0 -9\.\-]+\.[A-Za-z]{2,24})

    Vis den til vår RegExp-funksjon:

    =RegExpExtract(A5, "@([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})")

    Og du får dette resultatet:

    Med klassiske regulære uttrykk er ikke alt utenfor en fangstgruppe inkludert i uttrekket. Ingen vet hvorfor VBA RegEx fungerer annerledes og fanger opp «@» også. For å bli kvitt det, kan du fjerne det første tegnet fra resultatet ved å erstatte det med en tom streng.

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

    Regulært uttrykk for å trekke ut telefonnumre

    Telefonnumre kan skrives på mange forskjellige måter, og det er derfor det er nesten umulig å komme opp med en løsning som fungerer under alle(\d{4}fra streng

    Et regulært uttrykk for å trekke ut en dato avhenger av formatet som datoen vises i i en streng. For eksempel:

    For å trekke ut datoer som 1/1/21 eller 01/01/2021, er det regulære uttrykket: \d{1,2}\/\d{1,2}\/(\d {4}omstendigheter. Likevel kan du skrive ned alle formatene som brukes i datasettet ditt og prøve å matche dem.

    For dette eksemplet skal vi lage et regulært uttrykk som vil trekke ut telefonnumre i hvilket som helst av disse formatene:

    (123) 345-6789

    (123) 345 6789

    (123)3456789

    123- 345-6789

    123.345.6789

    123 345 6789

    1233456789

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

    • Den første delen \(?\d{3} samsvarer med null eller én åpningsparentes etterfulgt av tre sifre d{3}.
    • [-\. \)]*-delen betyr et hvilket som helst tegn i hakeparenteser som vises 0 eller flere ganger: bindestrek, punktum, mellomrom eller avsluttende parentes.
    • Deretter har vi tre sifre igjen d{3} etterfulgt av bindestrek, punktum eller mellomrom [-\. ]? vises 0 eller 1 gang.
    • Deretter er det en gruppe med fire sifre \d{4}.
    • Til slutt er det en ordgrense \b som definerer at et telefonnummer vi er leter etter kan ikke være en del av et større tall.

    Den komplette formelen har denne formen:

    =RegExpExtract(A5, "\(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b")

    Vær oppmerksom på at regex ovenfor kan returnere noen få falske positive resultater som 123) 456 7899 eller (123 456 7899. Versjonen nedenfor løser disse problemene. Denne syntaksen fungerer imidlertid bare i VBA RegExp-funksjoner, ikke i klassiske regulære uttrykk.

    Mønster : (\(\d{3}\)ut for å trekke ut tekst mellom to tegn vil også fungere for å trekke ut tekst mellom to strenger.

    For å få alt mellom "test 1" og "test 2", bruk for eksempel følgende regulære uttrykk.

    Mønster : test 1(.*?)test 2

    Den komplette formelen er:

    =AblebitsRegexExtract(A5, "test 1(.*?)test 2")

    Regex for å trekke ut domene fra URL

    Selv med regulære uttrykk er det ikke en triviell oppgave å trekke ut domenenavn fra URL-er. Nøkkelelementet som gjør susen er ikke-fange grupper. Avhengig av det endelige målet ditt, velg en av regeksene nedenfor.

    For å få et fullt domenenavn inkludert underdomener

    mønster : (?: https?\:

    Michael Brown er en dedikert teknologientusiast med en lidenskap for å forenkle komplekse prosesser ved hjelp av programvareverktøy. Med mer enn ti års erfaring i teknologibransjen, har han forbedret ferdighetene sine i Microsoft Excel og Outlook, samt Google Sheets og Docs. Michaels blogg er dedikert til å dele sin kunnskap og ekspertise med andre, og gir enkle å følge tips og veiledninger for å forbedre produktivitet og effektivitet. Enten du er en erfaren profesjonell eller nybegynner, tilbyr Michaels blogg verdifull innsikt og praktiske råd for å få mest mulig ut av disse viktige programvareverktøyene.