Excel Regex: match strenger ved hjelp av regulære uttrykk

  • Dele Denne
Michael Brown

I denne opplæringen skal vi se nærmere på hvordan du bruker regex for å matche strenger i Excel.

Når du trenger å finne en bestemt verdi i et område av celler, vil du bruke MATCH- eller XMATCH-funksjonen. Når du ser etter en bestemt streng i en celle, kommer funksjonene FINN og SØK godt med. Og hvordan vet du om en celle inneholder informasjon som samsvarer med et gitt mønster? Åpenbart ved å bruke regulære uttrykk. Men ut av esken Excel støtter ikke regexes! Ingen grunn til bekymring, vi tvinger den til :)

    Excel VBA Regex-funksjon for å matche strenger

    Som det er ganske tydelig fra overskriften, for å bruke regulære uttrykk i Excel må du lage din egen funksjon. Heldigvis har Excels VBA et innebygd RegExp -objekt, som du kan bruke i koden din som vist nedenfor:

    Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() Som Variant 'array for å lagre resultatene Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'indeks for gjeldende rad i kildeområdet, indeks for gjeldende kolonne i kildeområdet, antall rader, antall rader kolonner Ved feil Gå til ErrHandl RegExpMatch = arRes Sett regex = CreateObject ("VBScript.RegExp") regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case Deretter regex.ignorecase = False Else regex. Sluttuttrykk.

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

    For bedre å forstå hva som skjer her, la oss se nærmere på hver del :

    • Brukernavn kan inneholde bokstaver, tall, understreker, prikker og bindestreker. Husk at \w samsvarer med enhver bokstav, siffer eller understrek, får vi følgende regulære uttrykk: [\w\.\-]+
    • Domenenavn kan inneholde store og små bokstaver, sifre, bindestreker (men ikke i første eller siste posisjon) og prikker (i tilfelle underdomener). Siden understreking ikke er tillatt, bruker vi i stedet for \w 3 forskjellige tegnsett: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
    • Toppnivådomene består av en prikk etterfulgt av store og små bokstaver. Den kan inneholde fra 2 til 24 bokstaver (den lengste TLD som eksisterer): \.[A-Za-z]{2,24}

    Merk. Mønsteret forutsetter at domenenavnet inneholder 2 eller flere alfanumeriske tegn.

    Med originalteksten i A5 og mønsteret i A5, har formelen denne formen:

    =RegExpMatch(A5, $A$2)

    Eller du kan bruke en enklere vanlig uttrykk for e-postvalidering med enten små eller store bokstaver:

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

    Men gjør formelen din uten store og små bokstaver:

    =RegExpMatch(A5, $A$2, FALSE)

    Excel IF-formel med matchende regex

    På grunn av det faktum at innebygd og tilpassetfunksjoner går bra sammen, det er ingenting som hindrer deg i å bruke dem sammen i en enkelt formel.

    For å returnere eller beregne noe hvis et regulært uttrykk samsvarer og noe annet hvis det ikke samsvarer, bygg inn den tilpassede RegExpMatch funksjon i den logiske teksten til IF:

    IF(RegExpMatch(…), [value_if_true], [value_if_false])

    For eksempel, hvis en streng i A5 inneholder en gyldig e-postadresse, kan du returnere "Ja"; ellers "Nei".

    =IF(RegExpMatch(A5, $A$2,), "Yes", "No")

    Tell hvis regex matches

    Fordi opprinnelige Excel-funksjoner ikke støtter regulære uttrykk, er det ikke mulig å sette et regex direkte i COUNTIS- eller COUNTIFS-funksjonen. Heldigvis kan du emulere denne funksjonaliteten ved å bruke vår egendefinerte funksjon.

    Forutsatt at du har brukt et regulært uttrykk for å matche telefonnumre og sende ut resultatene i kolonne B. For å finne ut hvor mange celler som inneholder telefonnumre, trenger du bare for å telle TRUE-verdiene i B5:B9. Og det kan enkelt gjøres ved å bruke standard COUNTIF-formelen:

    =COUNTIF(B5:B9, TRUE)

    Vil du ikke ha noen ekstra kolonner i regnearket ditt? Ikke noe problem. Husk at vår egendefinerte funksjon kan behandle flere celler om gangen og Excels SUM kan legge sammen verdier i en matrise, så gjør du dette:

    • Legg inn en områdereferanse til RegExpMatch, så den returnerer en rekke av SANN- og FALSE-verdier.
    • Bruk en dobbel negasjon (--) for å tvinge de logiske verdiene til enere ognuller.
    • Få SUM-funksjonen for å legge sammen 1-er og 0-er i den resulterende matrisen.

    =SUM(--RegExpMatch(A5:A9, $A$2))

    Regex-matching med Ultimate Suite

    Brukerne av Ultimate Suite kan utnytte fire kraftige Regex-funksjoner uten å legge til noen VBA-kode i arbeidsbøkene sine, da de er jevnt integrert i Excel under installasjonen av tillegget. Våre egendefinerte funksjoner behandles av standard .NET RegEx-motor og støtter klassiske regulære uttrykk med alle funksjoner.

    Hvordan bruke egendefinert RegexMatch-funksjon

    Forutsatt at du har den nyeste versjonen av Ultimate Suite installert ( 2021.4 eller nyere), kan du opprette en Regex Match-formel i to enkle trinn:

    1. I kategorien Ablebits Data i Text -gruppen klikker du på Regex-verktøy .

  • Gjør følgende i ruten Regex-verktøy :
    • Velg kildestrengene.
    • Skriv inn mønsteret ditt.
    • Velg alternativet Samsvar .
    • For å ha resultatene som formler, ikke verdier, velger du Sett inn som en formel avmerkingsboks.
    • Klikk på Samsvar -knappen.

    Et øyeblikk senere settes AblebitsRegexMatch -funksjonen inn i en ny kolonne til høyre for dataene dine.

    I skjermbildet nedenfor sjekker funksjonen om strengene i kolonne A inneholder 7-sifret tall eller ikke.

    Tips:

    • The func sjonen kan settes inn direkte i en celle via standard dialogboksen Sett inn funksjon , hvor den er kategorisert under AblebitsUDFs .
    • Som standard legges et regulært uttrykk til formelen, men du kan også beholde det i en egen celle. For dette, bruk bare en cellereferanse for det andre argumentet.
    • Som standard er funksjonen forbokstavsensitiv . For å ikke skille mellom store og små bokstaver, bruk (?i)-mønsteret.

    For mer informasjon, se funksjonen AblebitsRegexMatch.

    Slik gjør du samsvar med regulære uttrykk i Excel. Jeg takker for at du leser og ser frem til å se deg på bloggen vår neste uke!

    Tilgjengelige nedlastinger

    Excel Regex Match-eksempler (.xlsm-fil)

    Ultimate Suite 14- dag fullt funksjonell versjon (.exe-fil)

    If cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputRows, 1 To cntInputRows) For iInputCurRow = 1 To cntInputRows For iInput ToCurColorReput. .Cells(iInputCurRow, iInputCurCol).Value) Neste Neste RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) Sluttfunksjon

    Lim inn koden i VBA-editoren, og din nye RegExpMatch -funksjon er klar til bruk. Hvis du ikke er veldig erfaren med VBA, kan denne veiledningen være nyttig: Slik setter du inn VBA-kode i Excel.

    Merk. Etter at du har satt inn koden, husk å lagre filen som en makroaktivert arbeidsbok (.xlsm).

    RegExpMatch-syntaks

    RegExpMatch -funksjonen sjekker om noen del av kildestrengen samsvarer med et regulært uttrykk. Resultatet er en boolsk verdi: TRUE hvis minst ett samsvar er funnet, FALSE ellers.

    Vår egendefinerte funksjon har 3 argumenter - de to første er obligatoriske og det siste er valgfritt:

    RegExpMatch(tekst , mønster, [match_case])

    Hvor:

    • Tekst (påkrevd) - en eller flere strenger å søke i. Kan leveres som en celle- eller områdereferanse.
    • Mønster (påkrevd) - det regulære uttrykket som skal samsvare. Når det plasseres direkte i en formel, må et mønster omsluttes av doble anførselstegn.
    • Match_case (valgfritt) - definerer samsvarettype. 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, Excel 2019, Excel 2016, Excel 2013 og Excel 2010.

    3 ting du bør vite om RegExpMatch

    Før vi kommer til praktiske beregninger, vennligst legg merke til følgende punkter som klargjør noen tekniske detaljer:

    1. Funksjonen kan behandle en enkeltcelle eller celleområde . I sistnevnte tilfelle returneres resultatene i nabocellene i form av en dynamisk matrise, eller spillområde, som vist i dette eksempelet.
    2. Som standard er funksjonen forbokstavsensitiv . For å ignorere store og små bokstaver, sett match_case -argumentet til FALSE. På grunn av VBA Regexp-begrensninger støttes ikke det store og små bokstav-ufølsomme mønsteret (?i).
    3. Hvis et gyldig mønster ikke blir funnet, returnerer funksjonen FALSE; hvis mønsteret er ugyldig , vises en #VERDI! feil oppstår.

    Nedenfor finner du noen eksempler på regex-samsvar som ble opprettet for demonstrasjonsformål. Vi kan ikke garantere at mønstrene våre vil fungere feilfritt med et bredere spekter av inndata i dine ekte regneark. Før du setter i produksjon, sørg for å teste og justere prøvemønstrene våre i henhold til dine behov.

    Hvordan bruke regex for å matche strenger i Excel

    Når alle strengene du vil matche har samme mønster,regulære uttrykk er en ideell løsning.

    Forutsatt at du har en rekke celler (A5:A9) som inneholder ulike detaljer om enkelte elementer. Du ønsker å vite hvilke celler som har SKU-er. Forutsatt at hver SKU består av 2 store bokstaver, en bindestrek og 3 sifre, kan du matche dem ved å bruke følgende uttrykk.

    Mønster : \b[A-Z]{2}-\ d{3}\b

    Hvor [A-Z]{2} betyr 2 store bokstaver fra A til Å og \d{3} betyr 3 siffer fra 0 til 9. \b-tegnet angir et ord grense, som betyr at en SKU er et eget ord, og ikke en del av en større streng som 23-MAR-2022.

    Med mønsteret etablert, kan vi gå videre til å skrive en formel. I hovedsak er bruk av en egendefinert funksjon ikke forskjellig fra en innfødt. Så snart du begynner å skrive en formel, vil funksjonens navn vises i listen foreslått av Excels Autofullfør. Det er imidlertid et par nyanser i Dynamic Array Excel (Microsoft 365 og Excel 2021) og tradisjonell Excel (2019 og eldre versjoner).

    Samsvar streng i én celle

    For å matche en streng i en enkelt celle, referer til den cellen i det første argumentet. Det andre argumentet er ment å inneholde et regulært uttrykk.

    =RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")

    Mønsteret kan også holdes i en forhåndsdefinert celle, som er låst med en absolutt referanse ($A$2):

    =RegExpMatch(A5, $A$2)

    Etter å ha skrevet inn formelen i den første cellen, kan du dra den ned til alle andre rader.

    Denne metodenfungerer vakkert i alle Excel-versjoner .

    Samsvar strenger i flere celler samtidig

    For å matche flere strenger med en enkelt formel, inkludere en rekkeviddereferanse i det første argumentet:

    =RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")

    I Excel 365 og Excel 2021 som støtter dynamiske arrays, fungerer det på denne måten - du skriver inn formelen i den første cellen, trykker på Enter , og formelen kommer automatisk inn i cellene nedenfor.

    I Excel 2019 og tidligere, fungerer bare som en tradisjonell CSE-matriseformel, som legges inn i en rekke celler og fullføres ved å trykke Ctrl + Shift + Enter samtidig.

    Regex for å matche nummer

    For å matche et enkelt siffer fra 0 til 9, bruk \d -tegnet i regex. Avhengig av din spesifikke oppgave, legg til en passende kvantifier eller lag et mer komplekst mønster.

    Regex for å matche et hvilket som helst tall

    For å matche et hvilket som helst tall av hvilken som helst lengde, sett +-kvantifisereren rett etter / d-tegn, som sier å se etter tall som inneholder 1 eller flere sifre.

    Mønster : \d+

    =RegExpMatch(A5:A9, "\d+")

    Regex for å matche antall av spesifikk lengde

    Hvis målet ditt er å matche numeriske verdier som inneholder et visst antall sifre, bruk \d sammen med en passende kvantifier.

    For eksempel, for å matche fakturanumre som består av nøyaktig 7 sifre, bruker du \d{7}. Vær imidlertid oppmerksom på at den vil matche 7som forventet:

    Merknader:

    • Internasjonale koder er ikke sjekket, så de kan være til stede eller ikke.
    • I regulære uttrykk står \s for et mellomromstegn som mellomrom, tabulator, vognretur eller ny linje. For å tillate bare mellomrom, bruk [-\. ] i stedet for [-\.\s].
    • Regex to NOT match character

      For å finne strenger som IKKE inneholder et bestemt tegn, kan du bruke negerte tegnklasser [^ ] som matcher noe IKKE i parentes. For eksempel:

      • [^13] vil samsvare med et enkelt tegn som ikke er 1 eller 3.
      • [^1-3] vil samsvare med et enkelt tegn som ikke er 1, 2 eller 3 (dvs. et hvilket som helst siffer fra 1 til 3).

      I en liste over telefonnumre, anta at du vil finne de som ikke har en landskode. Husk at enhver internasjonal kode inkluderer +-tegnet, kan du bruke tegnklassen [^\+] for å finne strenger som ikke inneholder et plusstegn. Det er viktig å innse at uttrykket ovenfor samsvarer med ethvert enkelt tegn som ikke er +. Fordi et telefonnummer kan være hvor som helst i en streng, ikke nødvendigvis helt i begynnelsen, legges *-kvantifieren til for å kontrollere hvert påfølgende tegn. Start ^ og slutt $ ankrene sørger for at hele strengen blir behandlet. Som et resultat får vi det regulære uttrykket nedenfor som sier "ikke samsvar med +-tegnet i noen posisjon i strengen".

      Mønster :^[^\+]*$

      =RegExpMatch(A5, "^[^\+]*$")

      Regex skal IKKE samsvare med streng

      Selv om det ikke er noen spesiell syntaks for regulære uttrykk for ikke samsvarer med en spesifikk streng, kan du etterligne denne oppførselen ved å bruke et negativt blikk.

      Forutsatt at du ønsker å finne strenger som ikke inneholder ordet "sitroner". Dette regulære uttrykket vil fungere som en godbit:

      Mønster : ^((?!sitroner).)*$

      Det er klart at det trengs en forklaring her. Den negative lookahead (?!sitroner) ser til høyre for å se om det ikke er noe ord "sitroner" foran. Hvis "sitroner" ikke er der, samsvarer prikken med et hvilket som helst tegn bortsett fra et linjeskift. Uttrykket ovenfor utfører bare én sjekk, og *-kvantifieren gjentar det null eller flere ganger, fra starten av strengen forankret av ^ til slutten av strengen forankret med $.

      For å ignorere store og små bokstaver, vi setter det tredje argumentet til FALSE for å gjøre funksjonen vår ufølsom for store og små bokstaver:

      =RegExpMatch(A5, $A$2, FALSE)

      Tips og merknader:

      • Regex ovenfor fungerer bare for strenger med enkeltlinje . I tilfelle av milti-linje-strenger, samsvarer ^- og $-tegnene begynnelsen og slutten av hver linje i stedet for begynnelsen og slutten av inndatastrengen, derfor søker regex bare på den første linjen.
      • For å matche strenger som ikke starter med bestemt tekst , bruk et regulært uttrykk som ^(?!sitroner).*$
      • For å matche strenger som ikke slutter med bestemt tekst , inkluderer duendestrengen anker inn i søkemønsteret: ^((?!lemons$).)*$

      Kapitel-ufølsom matching

      I klassiske regulære uttrykk er det et spesielt mønster for samsvar mellom store og små bokstaver (?i), som ikke støttes i VBA RegExp. For å overvinne denne begrensningen godtar vår egendefinerte funksjon det tredje valgfrie argumentet kalt match_case . For å gjøre samsvaring uten store og små bokstaver, sett den til FALSE.

      La oss si at du ønsker å identifisere datoer som 1-22-mars eller 01-mars-2022. For å matche formatene dd-mmm-åååå og d-mmm-ååå bruker vi følgende regulære uttrykk.

      Mønster : \b\d{1,2}-(jansifre hvor som helst i strengen, inkludert et 10-sifret eller 100-sifret tall. Hvis dette ikke er det du ser etter, sett ordet grense \b på begge sider.

      Mønster : \b\d{7}\b

      =RegExpMatch(A5:A9, "\b\d{7}\b")

      Regex for å matche telefonnumre

      Siden telefonnumre kan skrives i ulike formater, krever matching av dem et mer sofistikert regulært uttrykk.

      I datasettet nedenfor vil vi søke etter 10-sifrede tall som har 3 sifre i de to første gruppene og 4 sifre i den siste gruppen. Gruppene kan skilles med punktum, bindestrek eller mellomrom. Den første gruppen kan være omgitt av parentes eller ikke.

      Mønster: (\(\d{3}\)

    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.