Excel Regex: pas stringe met gewone uitdrukkings

  • Deel Dit
Michael Brown

In hierdie tutoriaal sal ons 'n in-diepte kyk na hoe om regex te gebruik om stringe in Excel te pas.

Wanneer jy 'n sekere waarde in 'n reeks moet vind van selle, sal jy die MATCH- of XMATCH-funksie gebruik. Wanneer jy na 'n spesifieke string in 'n sel soek, kom die FIND- en SEARCH-funksies handig te pas. En hoe weet jy of 'n sel inligting bevat wat by 'n gegewe patroon pas? Natuurlik, deur gereelde uitdrukkings te gebruik. Maar uit die boks Excel ondersteun nie regexes nie! Geen bekommernisse nie, ons sal dit dwing om :)

    Excel VBA Regex-funksie om stringe te pas

    Soos dit redelik duidelik uit die opskrif is, om gereelde uitdrukkings te gebruik in Excel, moet jy jou eie funksie skep. Gelukkig het Excel se VBA 'n ingeboude RegExp -objek, wat jy in jou kode kan gebruik soos hieronder getoon:

    Publieke Funksie RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'skikking om die resultate te stoor Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'indeks van die huidige ry in die bronreeks, indeks van die huidige kolom in die bronreeks, telling van rye, telling van kolomme op fout Gaan na ErrHandl RegExpMatch = arRes Stel regex = CreateObject ( "VBScript.RegExp") regex.pattern = patroon regex.Global = True regex.MultiLine = True If True = match_case Dan regex.ignorecase = False Else regex. Eindeuitdrukkings.

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

    Om beter te verstaan ​​wat hier aangaan, kom ons kyk na elke deel van naderby :

    • Gebruikersnaam kan letters, syfers, onderstrepings, kolletjies en koppeltekens insluit. As ons in gedagte hou dat \w by enige letter, syfer of onderstreep pas, kry ons die volgende regex: [\w\.\-]+
    • Domainnaam kan hoofletters en kleinletters insluit, syfers, koppeltekens (maar nie in die eerste of laaste posisie nie) en kolletjies (in die geval van subdomeine). Aangesien onderstrepings nie toegelaat word nie, gebruik ons ​​in plaas van \w 3 verskillende karakterstelle: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
    • Topvlakdomein bestaan ​​uit 'n kolletjie gevolg deur hoofletters en kleinletters. Dit kan van 2 tot 24 letters bevat (die langste TLD wat tans bestaan): \.[A-Za-z]{2,24}

    Let wel. Die patroon neem aan dat die domeinnaam 2 of meer alfanumeriese karakters bevat.

    Met die oorspronklike teks in A5 en die patroon in A5 neem die formule hierdie vorm aan:

    =RegExpMatch(A5, $A$2)

    Of jy kan 'n eenvoudiger gewone gebruik uitdrukking vir e-pos validering met óf 'n kleinletter óf 'n hoofletter karakterstel:

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

    Maar maak jou formule hoofletter-onsensitief:

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

    Excel IF-formule met ooreenstemmende regex

    As gevolg van die feit dat ingeboude en pasgemaaktefunksies gaan goed saam, daar is niks wat jou sal verhoed om hulle saam in 'n enkele formule te gebruik nie.

    Om iets terug te gee of te bereken as 'n gewone uitdrukking ooreenstem en iets anders as dit nie ooreenstem nie, bed die pasgemaakte RegExpMatch in funksie in die logiese teks van IF:

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

    Byvoorbeeld, as 'n string in A5 'n geldige e-posadres bevat, kan jy "Ja" terugstuur; anders "Nee".

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

    Tel as regeks ooreenstem

    Omdat inheemse Excel-funksies nie gereelde uitdrukkings ondersteun nie, is dit nie moontlik om 'n regeks direk in die COUNTIS- of COUNTIFS-funksie te plaas nie. Gelukkig kan jy hierdie funksionaliteit naboots deur ons pasgemaakte funksie te gebruik.

    Gestel jy het 'n regeks gebruik om telefoonnommers te pas en die resultate in kolom B uit te voer. Om uit te vind hoeveel selle telefoonnommers bevat, hoef jy net om die WARE waardes in B5:B9 te tel. En dit kan maklik gedoen word deur die standaard COUNTIF-formule te gebruik:

    =COUNTIF(B5:B9, TRUE)

    Wil jy geen ekstra kolomme in jou werkblad hê nie? Geen probleem. As u in gedagte hou dat ons pasgemaakte funksie veelvuldige selle op 'n slag kan verwerk en Excel se SOM waardes in 'n skikking kan optel, is dit wat u doen:

    • Gee 'n reeksverwysing na RegExpMatch, sodat dit 'n skikking van WAAR en ONWAAR waardes.
    • Gebruik 'n dubbele ontkenning (--) om die logiese waardes te dwing na ene ennulle.
    • Kry die SOM-funksie om 1'e en 0'e in die resulterende skikking op te tel.

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

    Regex-passing met Ultimate Suite

    Die gebruikers van ons Ultimate Suite kan vier kragtige Regex-funksies gebruik sonder om enige VBA-kode by hul werkboeke te voeg, aangesien hulle glad in Excel geïntegreer word tydens die byvoegingsinstallasie. Ons pasgemaakte funksies word deur die standaard .NET RegEx-enjin verwerk en ondersteun klassieke gewone uitdrukkings met volledige kenmerke.

    Hoe om die pasgemaakte RegexMatch-funksie te gebruik

    As jy aanvaar dat jy die nuutste weergawe van Ultimate Suite geïnstalleer het ( 2021.4 of later), kan jy 'n Regex Match-formule in twee eenvoudige stappe skep:

    1. Op die Ablebits Data -oortjie, in die Teks -groep, klik Regex Tools .

  • Doen die volgende in die Regex Tools paneel:
    • Kies die bronstringe.
    • Voer jou patroon in.
    • Kies die Pas -opsie.
    • Om die resultate as formules te hê, nie waardes nie, kies die Voeg as 'n formule in -merkblokkie.
    • Klik op die Pas -knoppie.

    'n Oomblik later word die AblebitsRegexMatch -funksie in 'n nuwe kolom regs van jou data ingevoeg.

    In die skermkiekie hieronder kyk die funksie of die stringe in kolom A 7-syfer bevat getalle of nie.

    Wenke:

    • The func sie kan ingevoeg word direk in 'n sel via die standaard Voeg funksie in dialoogkassie, waar dit onder AblebitsUDFs gekategoriseer word.
    • By verstek word 'n gewone uitdrukking by die formule gevoeg, maar jy kan ook hou dit in 'n aparte sel. Gebruik hiervoor net 'n selverwysing vir die 2de argument.
    • By verstek is die funksie hooflettergevoelig . Vir hoofletter-onsensitiewe passing, gebruik die (?i)-patroon.

    Vir meer inligting, sien asseblief AblebitsRegexMatch-funksie.

    Dis hoe om gereelde uitdrukkingpassing in Excel te doen. Ek bedank jou vir die lees en sien uit daarna om jou volgende week op ons blog te sien!

    Beskikbare aflaaie

    Excel Regex Match-voorbeelde (.xlsm-lêer)

    Ultimate Suite 14- dag ten volle funksionele weergawe (.exe-lêer)

    If cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputRows, 1 To cntInputCols) For iInputCurRow = 1 To cntInputRows For iInputTourKolReInput iInputCurKolReInvoer iInputCurKolReIns(exput To cntInputRows) .Cells(iInputCurRow, iInputCurCol).Value) Volgende Volgende RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) Eindfunksie

    Plak die kode in die VBA-redigeerder, en jou nuwe RegExpMatch funksie is gereed vir gebruik. As jy nie baie ervare is met VBA nie, kan hierdie gids nuttig wees: Hoe om VBA-kode in Excel in te voeg.

    Let wel. Nadat jy die kode ingevoeg het, onthou om jou lêer as 'n makro-geaktiveerde werkboek (.xlsm) te stoor.

    RegExpMatch-sintaksis

    Die RegExpMatch -funksie kontroleer of enige deel van die bronstring by 'n gewone uitdrukking pas. Die resultaat is 'n Boole-waarde: WAAR as ten minste een passing gevind word, anders ONWAAR.

    Ons pasgemaakte funksie het 3 argumente - die eerste twee word vereis en die laaste een is opsioneel:

    RegExpMatch(text , patroon, [match_case])

    Waar:

    • Teks (vereis) - een of meer stringe om in te soek. Kan as 'n sel- of reeksverwysing verskaf word.
    • Patroon (vereis) - die gereelde uitdrukking om te pas. Wanneer dit direk in 'n formule geplaas word, moet 'n patroon in dubbele aanhalingstekens ingesluit word.
    • Pasmaatgeval (opsioneel) - definieer die pasmaattipe. Indien WAAR of weggelaat (verstek), word hooflettergevoelige passing uitgevoer; indien ONWAAR - hoofletter-onsensitief.

    Die funksie werk in alle weergawes van Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 en Excel 2010.

    3 dinge wat jy moet weet van RegExpMatch

    Voordat ons by praktiese berekeninge uitkom, neem asseblief kennis van die volgende punte wat sommige tegniese aspekte verduidelik:

    1. Die funksie kan 'n enkelsel<9 verwerk> of reeks selle . In laasgenoemde geval word die resultate in die naburige selle teruggestuur in die vorm van 'n dinamiese skikking, of morsreeks, soos in hierdie voorbeeld getoon.
    2. By verstek is die funksie hooflettergevoelig . Om teksletters te ignoreer, stel die passing_case -argument op ONWAAR. As gevolg van die VBA Regexp beperkings, word die hoofletter-onsensitiewe patroon (?i) nie ondersteun nie.
    3. As 'n geldige patroon nie gevind word nie, gee die funksie ONWAAR terug; as die patroon ongeldig is , 'n #WAARDE! fout vind plaas.

    Hieronder sal jy 'n paar voorbeelde van regex-passing vind wat vir demonstrasiedoeleindes geskep is. Ons kan nie waarborg dat ons patrone foutloos sal werk met 'n wyer reeks invoerdata in jou regte werkblaaie nie. Voordat jy produksie instel, moet jy seker wees om ons voorbeeldpatrone te toets en aan te pas volgens jou behoeftes.

    Hoe om regex te gebruik om stringe in Excel te pas

    Wanneer al die stringe wat jy wil pas, die dieselfde patroon,gereelde uitdrukkings is 'n ideale oplossing.

    Gestel jy het 'n reeks selle (A5:A9) wat verskeie besonderhede oor sommige items bevat. Jy wil weet watter selle SKU's het. As ons aanvaar dat elke SKU uit 2 hoofletters, 'n koppelteken en 3 syfers bestaan, kan jy hulle pas deur die volgende uitdrukking te gebruik.

    Patroon : \b[A-Z]{2}-\ d{3}\b

    Waar [A-Z]{2} enige 2 hoofletters van A tot Z beteken en \d{3} enige 3 syfers van 0 tot 9 beteken. Die \b-karakter dui 'n woord aan grens, wat beteken dat 'n SKU 'n aparte woord is, en nie deel van 'n groter string soos 23-MAR-2022 nie.

    Met die patroon vasgestel, kan ons voortgaan om 'n formule te skryf. In wese verskil die gebruik van 'n pasgemaakte funksie nie van 'n inheemse een nie. Sodra jy 'n formule begin tik, sal die funksie se naam in die lys verskyn wat deur Excel se Outovoltooi voorgestel word. Daar is egter 'n paar nuanses in Dynamic Array Excel (Microsoft 365 en Excel 2021) en tradisionele Excel (2019 en ouer weergawes).

    Pas string in een sel

    Om 'n string te pas. in 'n enkele sel, verwys na daardie sel in die eerste argument. Die tweede argument is veronderstel om 'n gereelde uitdrukking te bevat.

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

    Die patroon kan ook in 'n voorafbepaalde sel gehou word, wat gesluit is met 'n absolute verwysing ($A$2):

    =RegExpMatch(A5, $A$2)

    Nadat jy die formule in die eerste sel ingevoer het, kan jy dit afsleep na alle ander rye.

    Hierdie metodewerk pragtig in alle Excel-weergawes .

    Pas stringe in veelvuldige selle gelyk

    Om veelvuldige stringe met 'n enkele formule te pas, sluit 'n reeksverwysing in die eerste argument in:

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

    In Excel 365 en Excel 2021 wat dinamiese skikkings ondersteun, werk dit so - jy tik die formule in die eerste sel, druk Enter, en die formule mors outomaties in die onderstaande selle in.

    In Excel 2019 en vroeër is dit werk slegs as 'n tradisionele CSE-skikkingformule, wat in 'n reeks selle ingevoer word en voltooi word deur die Ctrl + Shift + Enter-sleutels saam te druk.

    Regex om nommer te pas

    Om enige enkele syfer van 0 tot 9 te pas, gebruik die \d karakter in die regeks. Afhangende van jou spesifieke taak, voeg 'n geskikte kwantifiseerder by of skep 'n meer komplekse patroon.

    Regex om enige getal te pas

    Om enige getal van enige lengte te pas, plaas die + kwantifiseerder reg na die / d karakter, wat sê om te soek na nommers wat 1 of meer syfers bevat.

    Patroon : \d+

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

    Regex om getal van spesifieke lengte te pas

    As jou doel is om numeriese waardes wat 'n sekere aantal syfers bevat te pas, gebruik dan \d saam met 'n toepaslike kwantifiseerder.

    Byvoorbeeld, om faktuurnommers wat uit presies 7 syfers bestaan ​​te pas, sal jy \d{7} gebruik. Hou egter asseblief in gedagte dat dit by 7 sal passoos verwag:

    Notas:

    • Internasionale kodes word nie gekontroleer nie, dus kan hulle teenwoordig wees of nie.
    • In gereelde uitdrukkings staan ​​\s vir enige witspasiekarakter soos 'n spasie, oortjie, koetretoer of nuwe reël. Om slegs spasies toe te laat, gebruik [-\. ] in plaas van [-\.\s].
    • Regeks om NIE by karakter te pas nie

      Om stringe te vind wat NIE 'n sekere karakter bevat nie, kan jy ontkende karakterklasse [^ ] gebruik wat ooreenstem enigiets NIE tussen hakies nie. Byvoorbeeld:

      • [^13] sal pas by enige enkele karakter wat nie 1 of 3 is nie.
      • [^1-3] sal pas by enige enkele karakter wat nie 1 is nie, 2 of 3 (d.w.s. enige syfer van 1 tot 3).

      In 'n lys telefoonnommers, veronderstel jy wil dié vind wat nie 'n landkode het nie. Hou in gedagte dat enige internasionale kode die +-teken insluit, kan jy die [^\+] karakterklas gebruik om stringe te vind wat nie 'n plusteken bevat nie. Dit is belangrik om te besef dat die uitdrukking hierbo pas by enige enkele karakter wat nie + is nie. Omdat 'n telefoonnommer enige plek in 'n string kan wees, nie noodwendig heel aan die begin nie, word die * kwantifiseerder bygevoeg om elke daaropvolgende karakter na te gaan. Die begin ^ en einde $ ankers verseker dat die hele string verwerk word. As gevolg hiervan kry ons die onderstaande gereelde uitdrukking wat sê "moenie die + karakter in enige posisie in die string pas nie".

      Patroon :^[^\+]*$

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

      Regex om NIE string te pas nie

      Alhoewel daar geen spesiale reëlmatige uitdrukkingsintaksis vir wat nie by 'n spesifieke string pas nie, kan jy hierdie gedrag naboots deur 'n negatiewe vooruitsig te gebruik.

      Gestel jy wil stringe vind wat nie die woord "suurlemoene" bevat nie. Hierdie gereelde uitdrukking sal 'n lekkerny werk:

      Patroon : ^((?!suurlemoene).)*$

      Natuurlik is 'n bietjie verduideliking hier nodig. Die negatiewe uitkyk (?!suurlemoene) kyk na regs om te sien of daar nie 'n woord "suurlemoene" voor is nie. As "suurlemoene" nie daar is nie, pas die punt by enige karakter behalwe 'n lynbreuk. Die uitdrukking hierbo voer net een kontrole uit, en die * kwantifiseerder herhaal dit nul of meer keer, vanaf die begin van die string geanker deur ^ tot die einde van die string geanker deur $.

      Om die tekskas te ignoreer, ons stel die 3de argument op ONWAAR om ons funksie hoofletteronsensitief te maak:

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

      Wenke en notas:

      • Bogenoemde regex werk net vir enkellyn -stringe. In die geval van milti-lyn stringe, pas die ^ en $ karakters by die begin en einde van elke reël in plaas van die begin en einde van die invoerstring, daarom soek die regeks slegs in die eerste reël.
      • Om stringe wat nie begin nie met sekere teks te pas, gebruik 'n gereelde uitdrukking soos ^(?!lemoene).*$
      • Om stringe wat nie eindig met sekere teks te pas, sluit indie eindstring anker in die soekpatroon: ^((?!lemons$).)*$

      Kase-onsensitiewe passing

      In klassieke gewone uitdrukkings is daar 'n spesiale patroon vir hoofletter-onsensitiewe passing (?i), wat nie in VBA RegExp ondersteun word nie. Om hierdie beperking te oorkom, aanvaar ons pasgemaakte funksie die 3de opsionele argument genaamd match_case . Om hoofletter-onsensitiewe passing te doen, stel dit eenvoudig op ONWAAR.

      Kom ons sê jy wil datums soos 1-Mrt-22 of 01-Mrt-2022 identifiseer. Om die dd-mmm-jjjj - en d-mmm-jj -formate te pas, gebruik ons ​​die volgende gereelde uitdrukking.

      Patroon : \b\d{1,2}-(Jansyfers op enige plek in die string insluitend 'n 10-syfer of 100-syfer nommer. As dit nie is waarna jy soek nie, plaas die woordgrens \b aan beide kante.

      Patroon : \b\d{7}\b

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

      Regex om telefoonnommers te pas

      Aangesien telefoonnommers in verskeie formate geskryf kan word, vereis dit 'n meer gesofistikeerde gereelde uitdrukking om hulle te pas.

      In die onderstaande datastel, sal ons soek na 10-syfer nommers wat 3 syfers in die eerste 2 groepe en 4 syfers in die laaste groep het. Die groepe kan geskei word met 'n punt, koppelteken of spasie. Die eerste groep mag of mag nie tussen hakies ingesluit word nie.

      Patroon: (\(\d{3}\)

    Michael Brown is 'n toegewyde tegnologie-entoesias met 'n passie om komplekse prosesse te vereenvoudig deur sagteware-instrumente te gebruik. Met meer as 'n dekade se ondervinding in die tegnologiebedryf, het hy sy vaardighede in Microsoft Excel en Outlook, sowel as Google Sheets en Docs, opgeskerp. Michael se blog is toegewy daaraan om sy kennis en kundigheid met ander te deel, en verskaf maklik-om-te volg wenke en tutoriale vir die verbetering van produktiwiteit en doeltreffendheid. Of jy nou 'n ervare professionele persoon of 'n beginner is, Michael se blog bied waardevolle insigte en praktiese raad om die meeste uit hierdie noodsaaklike sagteware-nutsmiddels te kry.