Excel Regex: matcha strängar med hjälp av reguljära uttryck

  • Dela Detta
Michael Brown

I den här handledningen får vi en djupgående titt på hur du använder regex för att matcha strängar i Excel.

När du behöver hitta ett visst värde i ett antal celler använder du funktionen MATCH eller XMATCH. När du letar efter en specifik sträng i en cell är funktionerna FIND och SEARCH praktiska. Och hur vet du om en cell innehåller information som matchar ett visst mönster? Självklart med hjälp av reguljära uttryck. Men Excel har inte stöd för reguljära uttryck! Oroa dig inte, vi tvingar den att göra det :)

    Excel VBA Regex-funktion för att matcha strängar

    Som det framgår av rubriken måste du skapa en egen funktion för att kunna använda reguljära uttryck i Excel. Som tur är har Excels VBA en inbyggd funktion för att skapa reguljära uttryck i Excel. RegExp som du kan använda i din kod på följande sätt:

    Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'array för att lagra resultaten Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'index för aktuell rad i källområdet, index för aktuell kolumn i källområdet, antal rader, antal kolumner On Error GoTo ErrHandlRegExpMatch = arRes Set regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case Then regex.ignorecase = False Else regex.ignorecase = True End If cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputRows, 1 To cntInputCols) For iInputCurRow = 1 To cntInputRows ForiInputCurCol = 1 To cntInputCols arRes(iInputCurRow, iInputCurCol) = regex.Test(input_range.Cells(iInputCurRow, iInputCurCol).Value) Next Next RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) End Function

    Klistra in koden i VBA-redigeraren och din nya RegExpMatch Om du inte har så stor erfarenhet av VBA kan den här guiden vara till hjälp: How to insert VBA code in Excel (Hur man infogar VBA-kod i Excel).

    Obs. När du har infogat koden, kom ihåg att spara filen som en arbetsbok med makroaktiverad arbetsbok (.xlsm).

    Syntax för RegExpMatch

    RegExpMatch funktionen kontrollerar om någon del av källsträngen matchar ett reguljärt uttryck. Resultatet är ett boolskt värde: TRUE om minst en träff hittas, FALSE annars.

    Vår anpassade funktion har tre argument - de två första är obligatoriska och det sista är valfritt:

    RegExpMatch(text, mönster, [match_case])

    Var:

    • Text (obligatoriskt) - en eller flera strängar att söka i. Kan anges som en cell- eller intervallreferens.
    • Mönster (obligatoriskt) - det reguljära uttrycket som ska matchas. När ett mönster placeras direkt i en formel måste det omges av dubbla citattecken.
    • Match_case (valfritt) - definierar matchningstypen. Om TRUE eller utelämnas (standard) utförs en matchning som tar hänsyn till stor- och småbokstäver, om FALSE - inte tar hänsyn till stor- och småbokstäver.

    Funktionen fungerar i alla versioner av Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 och Excel 2010.

    3 saker du bör veta om RegExpMatch

    Innan vi går in på de praktiska beräkningarna bör du ta del av följande punkter som klargör vissa tekniska detaljer:

    1. Funktionen kan bearbeta en Enstaka cell. eller . antal celler I det senare fallet returneras resultaten i de angränsande cellerna i form av en dynamisk matris eller ett spillområde, som i det här exemplet.
    2. Som standard är funktionen Skiftlägeskänslig Om du vill bortse från textfältet ställer du in match_case På grund av begränsningarna i VBA Regexp stöds inte det skiftlägeskänsliga mönstret (?i).
    3. Om inget giltigt mönster hittas returnerar funktionen FALSE. Mönstret är ogiltigt. , uppstår ett #VALUE! fel.

    Nedan hittar du några exempel på regexmatchningar som skapades i demonstrationssyfte. Vi kan inte garantera att våra mönster fungerar felfritt med ett större urval av indata i dina riktiga arbetsblad. Innan du sätter dem i produktion, se till att du testar och justerar våra exempelmönster enligt dina behov.

    Hur du använder regex för att matcha strängar i Excel

    När alla strängar du vill matcha har samma mönster är reguljära uttryck en idealisk lösning.

    Anta att du har ett antal celler (A5:A9) som innehåller olika uppgifter om vissa artiklar. Du vill veta vilka celler som har SKU:er. Om du antar att varje SKU består av två stora bokstäver, ett bindestreck och tre siffror, kan du matcha dem med följande uttryck.

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

    Där [A-Z]{2} står för två stor bokstavsbokstäver från A till Z och \d{3} står för tre siffror från 0 till 9. Tecknet \b anger en ordgräns, vilket innebär att en SKU är ett separat ord och inte en del av en större sträng, t.ex. 23-MAR-2022.

    När mönstret är etablerat kan vi gå vidare till att skriva en formel. Att använda en anpassad funktion skiljer sig i princip inte från att använda en inhemsk funktion. Så snart du börjar skriva en formel visas funktionens namn i den lista som föreslås av Excels AutoComplete. Det finns dock ett par nyanser i Dynamic Array Excel (Microsoft 365 och Excel 2021) och det traditionella Excel (2019 och äldre versioner).

    Matcha strängar i en cell

    Om du vill matcha en sträng i en enskild cell hänvisar du till den cellen i det första argumentet. Det andra argumentet ska innehålla ett reguljärt uttryck.

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

    Mönstret kan också sparas i en fördefinierad cell som låses med en absolut referens ($A$2):

    =RegExpMatch(A5, $A$2)

    När du har skrivit in formeln i den första cellen kan du dra den ner till alla andra rader.

    Den här metoden fungerar utmärkt i alla Excel-versioner .

    Matcha strängar i flera celler samtidigt

    Om du vill matcha flera strängar med en enda formel inkluderar du en intervallreferens i det första argumentet:

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

    Excel 365 och Excel 2021 som har stöd för dynamiska matriser fungerar det så här: du skriver formeln i den första cellen, trycker på Enter och formeln hamnar automatiskt i cellerna nedanför.

    Excel 2019 och tidigare fungerar den endast som en traditionell CSE-arrayformel, som skrivs in i en rad celler och avslutas genom att trycka på tangenterna Ctrl + Shift + Enter samtidigt.

    Regex för att matcha nummer

    Om du vill matcha en enskild siffra från 0 till 9 använder du \d Beroende på din uppgift kan du lägga till en lämplig kvantifierare eller skapa ett mer komplext mönster.

    Regex för att matcha ett valfritt nummer

    Om du vill matcha alla nummer av alla längder sätter du kvantifikationen + direkt efter /d-tecknet, som säger att du ska leta efter nummer som innehåller 1 eller flera siffror.

    Mönster : \d+

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

    Regex för att matcha ett nummer med en viss längd

    Om ditt mål är att matcha numeriska värden som innehåller ett visst antal siffror använder du \d tillsammans med en lämplig kvantifierare.

    Om du till exempel vill matcha fakturanummer som består av exakt 7 siffror använder du \d{7}. Tänk dock på att det matchar 7 siffror var som helst i strängen, inklusive ett 10- eller 100-siffrigt nummer. Om detta inte är vad du letar efter kan du sätta ordgränsen \b på båda sidor.

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

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

    Regex för att matcha telefonnummer

    Eftersom telefonnummer kan skrivas i olika format krävs det ett mer sofistikerat reguljärt uttryck för att matcha dem.

    I nedanstående dataset söker vi efter 10-siffriga tal som har 3 siffror i de två första grupperna och 4 siffror i den sista gruppen. Grupperna kan skiljas åt med punkt, bindestreck eller mellanslag. Den första gruppen kan vara omsluten av parenteser eller inte.

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

    Om vi bryter ner det reguljära uttrycket får vi följande resultat:

    • Den första delen (\(\d{3}\)
    • Delen [-\.\s]? betyder 0 eller 1 förekomst av ett tecken inom hakparenteser: bindestreck, punkt eller blanksteg.
    • Därefter finns det ytterligare en grupp med tre siffror d{3} följt av ett bindestreck, en punkt eller ett mellanslag [\-\.\s]? som förekommer 0 eller 1 gång.
    • Den sista gruppen av fyra siffror \d{4} följs av en ordgräns \b för att klargöra att ett telefonnummer inte kan ingå i ett större nummer.

    Med den ursprungliga strängen i A5 och det reguljära uttrycket i A2 får formeln följande form:

    =RegExpMatch(A5, $A$2)

    ... och fungerar precis som förväntat:

    Anteckningar:

    • Internationella koder kontrolleras inte, så de kan finnas med eller inte.
    • I reguljära uttryck står \s för alla tecken för vitrymder, t.ex. mellanslag, tab, vagnretur eller ny rad. Om du vill tillåta endast mellanslag använder du [-\. ] i stället för [-\.\s].
    • Regex för att INTE matcha tecken

      För att hitta strängar som INTE innehåller ett visst tecken kan du använda negerade teckenklasser [^ ] som matchar allt som INTE står inom parentes. Exempel:

      • [^13] matchar alla enskilda tecken som inte är 1 eller 3.
      • [^1-3] matchar varje enskilt tecken som inte är 1, 2 eller 3 (dvs. varje siffra från 1 till 3).

      Anta att du i en lista med telefonnummer vill hitta de som inte har en landskod. Med tanke på att alla internationella koder innehåller tecknet + kan du använda teckenklassen [^\+] för att hitta strängar som inte innehåller ett plustecken. Det är viktigt att inse att ovanstående uttryck matchar varje enskilt tecken som inte är +. Eftersom ett telefonnummer kan vara var som helst i en sträng, inteI början läggs kvantifikatorn * till för att kontrollera varje efterföljande tecken. Ankaret i början ^ och i slutet $ säkerställer att hela strängen behandlas. Resultatet är nedanstående reguljära uttryck som säger "matcha inte +-tecknet i någon position i strängen".

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

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

      Regex för att INTE matcha strängen

      Även om det inte finns någon särskild syntax för reguljära uttryck för att inte matcha en specifik sträng kan du efterlikna detta beteende genom att använda en negativ lookahead.

      Om du vill hitta strängar som inte innehåller ordet "lemons". Det här reguljära uttrycket fungerar utmärkt:

      Mönster : ^(((?!citroner).)*$

      Det är uppenbart att det behövs en förklaring här. Den negativa lookahead (?!lemons) tittar till höger för att se om det inte finns något ord "lemons" framför sig. Om "lemons" inte finns där, matchar pricken vilket tecken som helst utom ett radbyte. Ovanstående uttryck utför bara en kontroll, och *-kvantifieringen upprepar den noll eller flera gånger, från början av strängen som är förankrad med ^ till slutet av strängen som är förankrad med$.

      För att ignorera skiftläget i texten ställer vi in det tredje argumentet till FALSE för att göra vår funktion okänslig för skiftlägen:

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

      Tips och anteckningar:

      • Ovanstående regex fungerar bara för enradig När det gäller strängar med flera rader matchar tecknen ^ och $ början och slutet av varje rad i stället för början och slutet av inmatningssträngen, vilket innebär att regexet endast söker på den första raden.
      • För att matcha strängar som inte starta. med viss text Använd ett reguljärt uttryck som ^(?!lemons).*$.
      • För att matcha strängar som inte avslutas med viss text inkludera slutsträngens ankare i sökmönstret: ^(((?!lemons$).)*$

      Skiftlägeskänslig matchning

      I klassiska reguljära uttryck finns det ett särskilt mönster för matchning som inte tar hänsyn till stor- och småbokstäver (?i), vilket inte stöds i VBA RegExp. För att övervinna denna begränsning accepterar vår anpassade funktion det tredje valfria argumentet som heter match_case Om du vill göra en matchning som inte tar hänsyn till stor- och små bokstäver anger du bara FALSE.

      Låt oss säga att du vill identifiera datum som till exempel 1-Mar-22 eller 01-MAR-2022. För att matcha dd-mmm-yyyy och d-mmm-yy format använder vi följande reguljära uttryck.

      Mönster : \b\d{1,2}-(Jan

      Vårt uttryck söker efter en grupp av 1 eller 2 siffror, följt av ett bindestreck, följt av någon av månadens förkortningar separerade med

      Varför inte använda ett enklare mönster som \d{1,2}-[A-Za-z]{3}-\d{2,4}\b? För att förhindra falska positiva matchningar som 01-ABC-2020.

      Skriv in mönstret i A2 och du får följande formel:

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

      Regex för att matcha giltiga e-postadresser

      Som allmänt känt består en e-postadress av fyra delar: användarnamn, @-symbol, domännamn (e-postserver) och toppdomän (t.ex. .com, .edu, .org etc.). För att kontrollera e-postadressens giltighet måste vi replikera ovanstående struktur med hjälp av reguljära uttryck.

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

      För att bättre förstå vad som händer här ska vi titta närmare på varje del:

      • Användarnamn kan innehålla bokstäver, siffror, understrykningar, punkter och bindestreck. Med tanke på att \w matchar alla bokstäver, siffror och understrykningar får vi följande regex: [\ww\.\-]+
      • Domännamn kan innehålla stora och små bokstäver, siffror, bindestreck (men inte i första eller sista positionen) och punkter (om det rör sig om underdomäner). Eftersom understrykningar inte är tillåtna använder vi tre olika teckenuppsättningar i stället för \w: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+[A-Za-z0-9]+[A-Za-z0-9]+[A-Za-z0-9]+
      • Toppdomän består av en punkt följt av stora och små bokstäver och kan innehålla mellan 2 och 24 bokstäver (den längsta toppdomänen som för närvarande finns): \..[A-Za-z]{2,24}

      Observera: Mönstret förutsätter att domännamnet innehåller 2 eller fler alfanumeriska tecken.

      Med originaltexten i A5 och mönstret i A5 får formeln denna form:

      =RegExpMatch(A5, $A$2)

      Du kan också använda ett enklare reguljärt uttryck för e-postvalidering med antingen små bokstäver eller versaler:

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

      Men gör formeln skiftlägeskänslig:

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

      Excel IF-formel med matchande regex

      Eftersom inbyggda och anpassade funktioner går bra ihop finns det inget som hindrar dig från att använda dem tillsammans i en enda formel.

      Om du vill returnera eller beräkna något om ett reguljärt uttryck matchas och något annat om det inte matchas bäddar du in den anpassade RegExpMatch-funktionen i den logiska texten i IF:

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

      Om en sträng i A5 till exempel innehåller en giltig e-postadress kan du returnera "Ja", annars "Nej".

      =IF(RegExpMatch(A5, $A$2,), "Ja", "Nej")

      Räknar om regex matchas

      Eftersom Excel-funktioner inte har stöd för reguljära uttryck är det inte möjligt att lägga in ett regex direkt i funktionen COUNTIS eller COUNTIFS. Lyckligtvis kan du efterlikna den här funktionen med hjälp av vår anpassade funktion.

      Anta att du har använt en regex för att matcha telefonnummer och skrivit ut resultaten i kolumn B. För att ta reda på hur många celler som innehåller telefonnummer behöver du bara räkna de sanna värdena i B5:B9. Det kan enkelt göras med hjälp av standardformeln COUNTIF:

      =COUNTIF(B5:B9, TRUE)

      Vill du inte ha några extra kolumner i ditt kalkylblad? Inga problem. Med tanke på att vår anpassade funktion kan bearbeta flera celler åt gången och att Excels SUM kan summera värden i en matris, gör du så här:

      • Ge en intervallreferens till RegExpMatch, så att den returnerar en matris med TRUE- och FALSE-värden.
      • Använd en dubbel negation (--) för att tvinga de logiska värdena till ettor och nollor.
      • Använd funktionen SUM för att addera 1:or och 0:or i den resulterande matrisen.

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

      Regexmatchning med Ultimate Suite

      Användarna av vår Ultimate Suite kan utnyttja fyra kraftfulla Regex-funktioner utan att lägga till någon VBA-kod i sina arbetsböcker eftersom de integreras smidigt i Excel under installationen av tillägget. Våra anpassade funktioner behandlas av standard .NET RegEx-motorn och stöder fullständiga klassiska reguljära uttryck.

      Hur du använder anpassad RegexMatch-funktion

      Om du har installerat den senaste versionen av Ultimate Suite (2021.4 eller senare) kan du skapa en formel för regexmatchning i två enkla steg:

      1. På den Uppgifter om Ablebits på fliken Text grupp, klicka på Regex-verktyg .

    • På den Regex-verktyg gör följande:
      • Välj källsträngar.
      • Ange ditt mönster.
      • Välj den Match alternativ.
      • Om du vill ha resultaten som formler, inte som värden, väljer du Infoga som en formel kryssrutan.
      • Klicka på Match knapp.

      Ett ögonblick senare kom AblebitsRegexMatch funktionen infogas i en ny kolumn till höger om dina data.

      I skärmdumpen nedan kontrollerar funktionen om strängarna i kolumn A innehåller 7-siffriga siffror eller inte.

      Tips:

      • Funktionen kan vara insatt direkt i en cell via standarden Infoga funktion dialogrutan, där den kategoriseras under AblebitsUDFs .
      • Som standard läggs ett reguljärt uttryck till i formeln, men du kan också ha det i en separat cell. Använd då bara en cellreferens för det andra argumentet.
      • Som standard är funktionen Skiftlägeskänslig Använd (?i) för att matcha mellan olika bokstäver.

      För mer information, se funktionen AblebitsRegexMatch.

      Så här gör du för att matcha reguljära uttryck i Excel. Tack för att du läste och jag ser fram emot att se dig på vår blogg nästa vecka!

      Tillgängliga nedladdningar

      Excel Regex Match-exempel (.xlsm-fil)

      Ultimate Suite 14-dagars fullt fungerande version (.exe-fil)

    Michael Brown är en hängiven teknikentusiast med en passion för att förenkla komplexa processer med hjälp av mjukvaruverktyg. Med mer än ett decenniums erfarenhet inom teknikbranschen har han finslipat sina kunskaper i Microsoft Excel och Outlook, samt Google Sheets och Docs. Michaels blogg är tillägnad att dela med sig av sin kunskap och expertis med andra, och tillhandahåller lätta att följa tips och handledningar för att förbättra produktiviteten och effektiviteten. Oavsett om du är en erfaren proffs eller nybörjare, erbjuder Michaels blogg värdefulla insikter och praktiska råd för att få ut det mesta av dessa viktiga programvaruverktyg.