Inhoudsopgave
In deze handleiding gaan we dieper in op het gebruik van regex om strings te matchen in Excel.
Wanneer je een bepaalde waarde moet vinden in een reeks cellen, gebruik je de MATCH of XMATCH functie. Wanneer je op zoek bent naar een specifieke tekenreeks in een cel, komen de FIND en SEARCH functies van pas. En hoe weet je of een cel informatie bevat die overeenkomt met een bepaald patroon? Uiteraard, door gebruik te maken van reguliere expressies. Maar uit de doos ondersteunt Excel geen regexen! Geen zorgen, wij dwingen het wel :)
Excel VBA Regex functie om strings te matchen
Zoals uit het kopje blijkt, moet je, om reguliere uitdrukkingen in Excel te gebruiken, je eigen functie maken. Gelukkig heeft Excel's VBA een ingebouwde RegExp object, dat u kunt gebruiken in uw code zoals hieronder getoond:
Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'array om de resultaten op te slaan Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'index van de huidige rij in het bronbereik, index van de huidige kolom in het bronbereik, aantal rijen, aantal kolommen 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 FunctionPlak de code in de VBA-editor, en uw nieuwe RegExpMatch functie is klaar voor gebruik. Als u niet erg ervaren bent met VBA, kan deze gids nuttig zijn: Hoe VBA-code in Excel invoegen.
Opmerking. Vergeet niet na het invoegen van de code uw bestand op te slaan als een werkmap met macro's (.xlsm).
RegExpMatch syntaxis
De RegExpMatch De functie controleert of een deel van de bronstring overeenkomt met een reguliere uitdrukking. Het resultaat is een Booleaanse waarde: TRUE als ten minste één overeenkomst is gevonden, anders FALSE.
Onze aangepaste functie heeft 3 argumenten - de eerste twee zijn vereist en de laatste is optioneel:
RegExpMatch(tekst, patroon, [match_case])Waar:
- Tekst (vereist) - een of meer tekenreeksen om in te zoeken. Kan worden opgegeven als een cel- of bereikverwijzing.
- Patroon (vereist) - de reguliere uitdrukking die moet worden gevonden. Wanneer een patroon rechtstreeks in een formule wordt geplaatst, moet het tussen dubbele aanhalingstekens staan.
- Geval (optioneel) - definieert het type overeenkomst. Indien TRUE of weggelaten (standaard), wordt hoofdlettergevoelige overeenkomst uitgevoerd; indien FALSE - hoofdletterongevoelig.
De functie werkt in alle versies van Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 en Excel 2010.
3 dingen die u moet weten over RegExpMatch
Alvorens over te gaan tot de praktische berekeningen, gelieve kennis te nemen van de volgende punten die enkele technische aspecten verduidelijken:
- De functie kan een enkele cel of reeks cellen In het laatste geval worden de resultaten teruggegeven in de aangrenzende cellen in de vorm van een dynamische array, of spill range, zoals in dit voorbeeld.
- Standaard is de functie hoofdlettergevoelig Om hoofdletters en kleine letters te negeren, stelt u de match_case Vanwege de beperkingen van VBA Regexp wordt het hoofdletterongevoelige patroon (?i) niet ondersteund.
- Als er geen geldig patroon wordt gevonden, geeft de functie FALSE terug; als de patroon is ongeldig treedt er een #VALUE! fout op.
Hieronder vindt u een paar voorbeelden van regex-matches die zijn gemaakt voor demonstratiedoeleinden. We kunnen niet garanderen dat onze patronen feilloos werken met een breder scala aan invoergegevens in uw echte werkbladen. Voordat u ze in productie neemt, moet u onze voorbeeldpatronen testen en aanpassen aan uw behoeften.
Regex gebruiken om strings te matchen in Excel
Wanneer alle strings die u wilt matchen hetzelfde patroon hebben, zijn reguliere expressies een ideale oplossing.
Stel, u hebt een cellenreeks (A5:A9) met verschillende gegevens over een aantal artikelen. U wilt weten welke cellen SKU's hebben. Ervan uitgaande dat elk SKU bestaat uit 2 hoofdletters, een koppelteken en 3 cijfers, kunt u ze matchen met de volgende uitdrukking.
Patroon : \b [A-Z] {2}-{3}...
Waarbij [A-Z]{2} staat voor 2 hoofdletters van A tot Z en \d{3} voor 3 cijfers van 0 tot 9. Het teken \b geeft een woordgrens aan, wat betekent dat een SKU een apart woord is, en geen deel van een grotere string zoals 23-MAR-2022.
Met het patroon vastgesteld, kunnen we overgaan tot het schrijven van een formule. In wezen is het gebruik van een aangepaste functie niet anders dan een native functie. Zodra u begint met het typen van een formule, verschijnt de naam van de functie in de lijst die wordt voorgesteld door Excel's AutoComplete. Er zijn echter een paar nuances in Dynamic Array Excel (Microsoft 365 en Excel 2021) en traditionele Excel (2019 en oudere versies).
Match string in één cel
Om overeen te komen met een tekenreeks in een enkele cel, verwijst u naar die cel in het eerste argument. Het tweede argument moet een reguliere expressie bevatten.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
Het patroon kan ook worden bewaard in een vooraf gedefinieerde cel, die wordt vergrendeld met een absolute verwijzing ($A$2):
=RegExpMatch(A5, $A$2)
Nadat u de formule in de eerste cel hebt ingevoerd, kunt u deze naar alle andere rijen slepen.
Deze methode werkt prachtig in alle Excel-versies .
Overeenstemming met tekenreeksen in meerdere cellen tegelijk
Om met één formule met meerdere tekenreeksen overeen te komen, neemt u in het eerste argument een bereikverwijzing op:
=RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")
In Excel 365 en Excel 2021 die dynamische matrices ondersteunen, werkt het zo - u typt de formule in de eerste cel, drukt op Enter , en de formule komt automatisch in de volgende cellen terecht.
In Excel 2019 en eerder, werkt het alleen als een traditionele CSE-arrayformule, die wordt ingevoerd in een cellenbereik en voltooid door de toetsen Ctrl + Shift + Enter samen in te drukken.
Regex om nummer te matchen
Om een willekeurig cijfer van 0 tot 9 te vinden, gebruikt u de \d Afhankelijk van uw specifieke taak voegt u een geschikte kwantor toe of maakt u een complexer patroon.
Regex om met een willekeurig getal overeen te komen
Om overeen te komen met elk getal van elke lengte, plaatst u de + kwantor vlak na het teken /d, dat zegt dat moet worden gezocht naar getallen die 1 of meer cijfers bevatten.
Patroon : \d+
=RegExpMatch(A5:A9, "\d+")
Regex om overeen te komen met getal van specifieke lengte
Als u numerieke waarden met een bepaald aantal cijfers wilt matchen, gebruik dan \d in combinatie met een geschikte kwantor.
Om bijvoorbeeld overeen te komen met factuurnummers die uit precies 7 cijfers bestaan, gebruik je \d{7}. Houd er echter rekening mee dat het overeenkomt met 7 cijfers overal in de string, inclusief een getal van 10 of 100 cijfers. Als dit niet is wat je zoekt, zet dan de woordgrens \b aan beide zijden.
Patroon .
=RegExpMatch(A5:A9, "\b\d{7}\b")
Regex om telefoonnummers te matchen
Aangezien telefoonnummers in verschillende formaten kunnen worden geschreven, vereist het matchen ervan een meer verfijnde reguliere expressie.
In de onderstaande dataset zoeken we naar 10-cijferige getallen met 3 cijfers in de eerste 2 groepen en 4 cijfers in de laatste groep. De groepen kunnen worden gescheiden door een punt, koppelteken of spatie. De eerste groep kan al dan niet tussen haakjes staan.
Patroon: (\d{3})
Als we deze reguliere expressie uitwerken, krijgen we het volgende:
- Het eerste deel (\d{3})...
- Het gedeelte [-----]? betekent 0 of 1 voorkomen van een teken tussen vierkante haken: koppelteken, punt of spatie.
- Vervolgens is er nog een groep van 3 cijfers d{3} gevolgd door een koppelteken, punt of spatie [{3}? die 0 of 1 keer voorkomt.
- De laatste groep van 4 cijfers \d{4} wordt gevolgd door een woordgrens \b om duidelijk te maken dat een telefoonnummer geen deel kan uitmaken van een groter nummer.
Met de oorspronkelijke string in A5 en de reguliere expressie in A2 neemt de formule deze vorm aan:
=RegExpMatch(A5, $A$2)
...en werkt precies zoals verwacht:
Opmerkingen:
- Internationale codes worden niet gecontroleerd, dus ze kunnen al dan niet aanwezig zijn.
- In reguliere expressies staat \s voor elk witruimte teken zoals een spatie, tab, carriage return of nieuwe regel. Om alleen spaties toe te staan, gebruik je [-\s] in plaats van [-\s].
- [^13] komt overeen met elk afzonderlijk teken dat niet 1 of 3 is.
- [^1-3] komt overeen met elk afzonderlijk teken dat niet 1, 2 of 3 is (d.w.z. elk cijfer van 1 tot 3).
- De bovenstaande regex werkt alleen voor eenregelig strings. In het geval van milti-line strings komen de ^ en $ tekens overeen met het begin en einde van elke regel in plaats van het begin en einde van de input string, daarom zoekt de regex alleen in de eerste regel.
- Om overeen te komen met strings die niet starten met bepaalde tekst gebruik dan een reguliere expressie zoals ^(?!citroenen).*$
- Om overeen te komen met strings die niet eindigen met bepaalde tekst , neem het eindstringanker op in het zoekpatroon: ^(?!citroenen$).)*$
- Gebruikersnaam kan letters, cijfers, underscores, punten en koppeltekens bevatten. In gedachten houdend dat \w overeenkomt met elke letter, cijfer of underscore, krijgen we de volgende regex: [\w.\-]+
- Domeinnaam mag hoofdletters en kleine letters, cijfers, koppeltekens (maar niet op de eerste of laatste positie) en punten (in het geval van subdomeinen) bevatten. Aangezien underscores niet zijn toegestaan, gebruiken we in plaats van \w 3 verschillende tekensets: [A-Za-z0-9]+[A-Za-z0-9.\-]*[A-Za-z0-9]+.
- Top-level domein bestaat uit een punt gevolgd door hoofdletters en kleine letters. Het kan 2 tot 24 letters bevatten (het langste TLD dat momenteel bestaat): \.[A-Za-z]{2,24}
- Geef een bereikreferentie aan RegExpMatch, zodat het een array van TRUE- en FALSE-waarden teruggeeft.
- Gebruik een dubbele negatie (--) om de logische waarden om te zetten in enen en nullen.
- Gebruik de SUM-functie om 1's en 0's op te tellen in de resulterende matrix.
- Op de Ablebits gegevens tabblad, in de Tekst groep, klik Regex gereedschap .
- Op de Regex gereedschap doe het volgende:
- Selecteer de bronreeksen.
- Voer je patroon in.
- Kies de Wedstrijd optie.
- Om de resultaten als formules en niet als waarden weer te geven, selecteert u de optie Invoegen als een formule check box.
- Klik op de Wedstrijd knop.
- De functie kan ingevoegd rechtstreeks in een cel via de standaard Functie invoegen dialoogvenster, waar het is gecategoriseerd onder AblebitsUDFs .
- Standaard wordt een reguliere expressie toegevoegd aan de formule, maar u kunt deze ook in een aparte cel houden. Gebruik hiervoor gewoon een celverwijzing voor het 2e argument.
- Standaard is de functie hoofdlettergevoelig Voor hoofdletteronafhankelijke aanpassing gebruikt u het (?i) patroon.
Regex om NIET overeen te komen met karakter
Om strings te vinden die een bepaald teken NIET bevatten, kunt u ontkennende tekenklassen [^ ] gebruiken die overeenkomen met alles wat NIET tussen haakjes staat. Bijvoorbeeld:
Stel dat u in een lijst met telefoonnummers degenen wilt vinden die geen landcode hebben. In gedachten houdend dat elke internationale code het plusteken bevat, kunt u de tekenklasse [^\+] gebruiken om strings te vinden die geen plusteken bevatten. Het is belangrijk om te beseffen dat de bovenstaande uitdrukking overeenkomt met elk afzonderlijk teken dat geen + is. Omdat een telefoonnummer overal in een string kan staan, is nietnoodzakelijkerwijs in het begin, wordt de * kwantificeerder toegevoegd om elk volgend teken te controleren. De begin ^ en eind $ ankers zorgen ervoor dat de hele string wordt verwerkt. Als resultaat krijgen we de onderstaande reguliere expressie die zegt "kom niet overeen met het + teken op elke positie in de string".
Patroon : ^[^\+]*$
=RegExpMatch(A5, "^[^^+]*$")
Regex om NIET overeen te komen met string
Hoewel er geen speciale syntaxis is voor een reguliere expressie die niet overeenkomt met een specifieke tekenreeks, kunt u dit gedrag emuleren door een negatieve lookahead te gebruiken.
Stel dat u strings wilt vinden die bevatten geen het woord "citroenen". Deze reguliere expressie zal goed werken:
Patroon : ^(?!citroenen).)*$
Uiteraard is hier enige uitleg nodig. De negatieve lookahead (?!citroenen) kijkt naar rechts om te zien of er geen woord "citroenen" voor ligt. Als "citroenen" er niet is, dan komt de punt overeen met elk teken behalve een regeleinde. De bovenstaande uitdrukking voert slechts één controle uit, en de * kwantificeerder herhaalt deze controle nul of meer keren, vanaf het begin van de string die is verankerd door ^ tot het einde van de string die is verankerd door$.
Om de hoofdletters van de tekst te negeren, zetten we het derde argument op FALSE om onze functie hoofdletterongevoelig te maken:
=RegExpMatch(A5, $A$2, FALSE)
Tips en opmerkingen:
Hoofdlettergevoelige aanpassing
In klassieke reguliere expressies is er een speciaal patroon voor hoofdletterongevoelige matching (?i), dat niet wordt ondersteund in VBA RegExp. Om deze beperking te omzeilen, accepteert onze aangepaste functie het 3e optionele argument met de naam match_case Om hoofdletterongevoelig te zoeken, zet u het gewoon op FALSE.
Laten we zeggen dat u data wilt identificeren zoals 1-Mar-22 of 01-MAR-2022. Om overeen te komen met de dd-mmm-jjjj en d-mmm-yy formaten, gebruiken we de volgende reguliere uitdrukking.
Patroon : \b{1,2}-(Jan
Onze uitdrukking zoekt naar een groep van 1 of 2 cijfers, gevolgd door een koppelteken, gevolgd door een van de maandafkortingen, gescheiden door
Waarom niet een eenvoudiger patroon zoals \d{1,2}-[A-Za-z]{3}-{2,4}? Om vals positieve overeenkomsten zoals 01-ABC-2020 te voorkomen.
Voer het patroon in A2 in, en je krijgt de volgende formule:
=RegExpMatch(A5, $A$2, FALSE)
Regex voor geldige e-mailadressen
Zoals algemeen bekend, bestaat een e-mailadres uit 4 delen: gebruikersnaam, @ symbool, domeinnaam (mailserver) en top-level domein (zoals .com, .edu, .org, etc.). Om de geldigheid van het e-mailadres te controleren, moeten we de bovenstaande structuur repliceren met behulp van reguliere expressies.
Patroon : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b
Om beter te begrijpen wat hier aan de hand is, laten we elk onderdeel nader bekijken:
Opmerking. Het patroon gaat ervan uit dat de domeinnaam 2 of meer alfanumerieke tekens bevat.
Met de oorspronkelijke tekst in A5 en het patroon in A5 krijgt de formule deze vorm:
=RegExpMatch(A5, $A$2)
Of u kunt een eenvoudiger reguliere expressie gebruiken voor e-mailvalidatie met een kleine of hoofdletterenset:
Patroon : \b[\w\.\-]+@[a-z0-9]+[a-z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b
Maar maak uw formule hoofdletter-ongevoelig:
=RegExpMatch(A5, $A$2, FALSE)
Excel IF formule met match regex
Omdat ingebouwde en aangepaste functies goed samengaan, is er niets dat u belet ze samen in één formule te gebruiken.
Om iets terug te geven of te berekenen als een reguliere uitdrukking wordt geëvenaard en iets anders als het niet wordt geëvenaard, kunt u de aangepaste functie RegExpMatch opnemen in de logische tekst van IF:
IF(RegExpMatch(...), [value_if_true], [value_if_false])Als bijvoorbeeld een string in A5 een geldig e-mailadres bevat, kunt u "Ja" teruggeven; anders "Nee".
=IF(RegExpMatch(A5, $A$2,), "Ja", "Nee")
Tellen of de regex overeenkomt
Omdat native Excel-functies geen reguliere expressies ondersteunen, is het niet mogelijk om een regex rechtstreeks in de COUNTIS- of COUNTIFS-functie op te nemen. Gelukkig kunt u deze functionaliteit emuleren met behulp van onze aangepaste functie.
Stel dat u een regex hebt gebruikt om telefoonnummers te matchen en de resultaten uitvoert in kolom B. Om uit te vinden hoeveel cellen telefoonnummers bevatten, hoeft u alleen maar de TRUE-waarden te tellen in B5:B9. En dat kan eenvoudig worden gedaan met de standaard COUNTIF-formule:
=COUNTIF(B5:B9, TRUE)
Wil je geen extra kolommen in je werkblad? Geen probleem. In gedachten houdend dat onze aangepaste functie meerdere cellen tegelijk kan verwerken en Excel's SUM waarden in een matrix kan optellen, is dit wat je doet:
=SUM(--RegExpMatch(A5:A9, $A$2))
Regex matching met Ultimate Suite
De gebruikers van onze Ultimate Suite kunnen gebruik maken van vier krachtige Regex functies zonder VBA code toe te voegen aan hun werkmappen, omdat deze soepel worden geïntegreerd in Excel tijdens de installatie van de add-in. Onze aangepaste functies worden verwerkt door de standaard .NET RegEx engine en ondersteunen volledige klassieke reguliere expressies.
Hoe aangepaste RegexMatch-functie te gebruiken
Ervan uitgaande dat u de laatste versie van Ultimate Suite geïnstalleerd heeft (2021.4 of later), kunt u een Regex Match formule maken in twee eenvoudige stappen:
Een moment later, de AblebitsRegexMatch functie wordt ingevoegd in een nieuwe kolom rechts van uw gegevens.
In het onderstaande screenshot controleert de functie of de strings in kolom A al dan niet 7-cijferige getallen bevatten.
Tips:
Voor meer informatie, zie AblebitsRegexMatch functie.
Dat is hoe je regular expression matching doet in Excel. Ik dank je voor het lezen en zie je graag volgende week op onze blog!
Beschikbare downloads
Excel Regex Match voorbeelden (.xlsm bestand)
Ultimate Suite 14 dagen volledig functionele versie (.exe bestand)