Excel Regex: oerien mei stringen mei reguliere útdrukkingen

  • Diel Dit
Michael Brown

Yn dizze tutorial sille wy yngeand sjen hoe't jo regex brûke om stringen yn Excel te passen.

As jo ​​in bepaalde wearde moatte fine yn in berik fan sellen, soene jo de MATCH- of XMATCH-funksje brûke. By it sykjen nei in spesifike tekenrige yn in sel, komme de funksjes FIND en SEARCH fan pas. En hoe witte jo as in sel ynformaasje befettet dy't oerienkomt mei in opjûn patroan? Fansels, troch it brûken fan reguliere útdrukkingen. Mar út 'e doaze Excel stipet gjin regexes! Gjin soargen, wy twinge it ta :)

    Excel VBA Regex-funksje om stringen te passen

    Sa't it frij dúdlik is út 'e koptekst, om reguliere útdrukkingen te brûken yn Excel moatte jo jo eigen funksje oanmeitsje. Lokkich hat Excel's VBA in ynboude RegExp -objekt, dat jo kinne brûke yn jo koade lykas hjirûnder werjûn:

    Publike funksje RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As fariant 'array om de resultaten op te slaan Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'yndeks fan 'e hjoeddeistige rige yn it boarneberik, yndeks fan 'e aktuele kolom yn it boarneberik, oantal rigen, telle fan kolommen By flater GoTo ErrHandl RegExpMatch = arRes Set regex = CreateObject ("VBScript.RegExp") regex.pattern = pattern regex.Global = True regex.MultiLine = Wier As Wier = match_case Dan regex.ignorecase = False Else regex. Einútdrukkingen.

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

    Om better te begripen wat hjir bart, litte wy elk diel fan tichterby besjen :

    • Brûkersnamme kin letters, sifers, ûnderstreken, stippen en koppeltekens befetsje. Tink derom dat \w oerienkomt mei elke letter, sifer of ûnderstreekje, krije wy de folgjende regex: [\w\.\-]+
    • Domeinnamme kin haadletters en lytse letters befetsje, sifers, koppeltekens (mar net yn 'e earste of lêste posysje) en punten (yn gefal fan subdomeinen). Om't ûnderstreken net tastien binne, brûke wy ynstee fan \w 3 ferskillende tekensets: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
    • Top-level domein bestiet út in punt folge troch haad- en lytse letters. It kin fan 2 oant 24 letters befetsje (de langste TLD dy't op it stuit bestiet): \.[A-Za-z]{2,24}

    Opmerking. It patroan giet derfan út dat de domeinnamme 2 of mear alfanumerike tekens befettet.

    Mei de orizjinele tekst yn A5 en it patroan yn A5, nimt de formule dizze foarm oan:

    =RegExpMatch(A5, $A$2)

    Of jo kinne in ienfâldiger gewoane brûke ekspresje foar e-postvalidaasje mei in set fan lytse letters as haadletters:

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

    Mar meitsje jo formule hoofdletter-ûngefoelich:

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

    Excel IF formule mei match regex

    Fanwegen it feit dat ynboude en oanpastefunksjes geane moai mei, d'r is neat dat jo foarkomme om se tegearre te brûken yn ien formule.

    Om wat werom te jaan of te berekkenjen as in reguliere ekspresje oerienkomt en wat oars as it net oerienkomt, ynbêde de oanpaste RegExpMatch yn funksje yn de logyske tekst fan IF:

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

    Bygelyks, as in tekenrige yn A5 in jildich e-postadres befettet, kinne jo "Ja" weromjaan; oars "Nee".

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

    Telle as regex oerienkomt

    Om't native Excel-funksjes gjin reguliere útdrukkingen stypje, is it net mooglik om in regex direkt yn 'e COUNTIS- of COUNTIFS-funksje te pleatsen. Gelokkich kinne jo dizze funksjonaliteit emulearje mei ús oanpaste funksje.

    Stel dat jo in regex brûkt hawwe om telefoannûmers te passen en de resultaten yn kolom B út te fieren. Om út te finen hoefolle sellen telefoannûmers befetsje, hoege jo gewoan om de TRUE wearden te tellen yn B5:B9. En dat kin maklik mei de standert COUNTIF-formule:

    =COUNTIF(B5:B9, TRUE)

    Wolle gjin ekstra kolommen yn jo wurkblêd? Gjin probleem. Hâld der rekken mei dat ús oanpaste funksje meardere sellen tagelyk kin ferwurkje en de SUM fan Excel kin wearden optelle yn in array, dit is wat jo dogge:

    • Lear in berikferwizing nei RegExpMatch, sadat it in array fan TRUE en FALSE wearden.
    • Brûk in dûbele negaasje (--) om de logyske wearden te twingen ta enen ennullen.
    • Krij de SUM-funksje om 1's en 0's op te tellen yn 'e resultearjende array.

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

    Regex-oerienkomst mei Ultimate Suite

    De brûkers fan ús Ultimate Suite kinne fjouwer krêftige Regex-funksjes brûke sûnder VBA-koade ta te foegjen oan har wurkboeken, om't se soepel yntegreare wurde yn Excel tidens de ynstallaasje fan tafoegings. Us oanpaste funksjes wurde ferwurke troch de standert .NET RegEx-motor en stypje klassike reguliere útdrukkingen mei folsleine funksjes.

    Hoe kinne jo de oanpaste RegexMatch-funksje brûke

    As jo ​​​​oannimme dat jo de lêste ferzje fan Ultimate Suite ynstalleare hawwe ( 2021.4 of letter), kinne jo in Regex Match-formule oanmeitsje yn twa ienfâldige stappen:

    1. Op it ljepblêd Ablebits Data , yn 'e Tekst -groep, klikje op Regex-ark .

  • Doe it folgjende yn it Regex-ark -paniel:
    • Selektearje de boarne strings.
    • Fier jo patroan yn.
    • Kies de opsje Match .
    • Om de resultaten as formules te hawwen, gjin wearden, selektearje de Ynfoegje as formule karfakje.
    • Klik op de knop Oerienkomst .

    Even letter wurdt de funksje AblebitsRegexMatch yn in nije kolom rjochts fan jo gegevens ynfoege.

    Yn de skermprint hjirûnder kontrolearret de funksje oft de strings yn kolom A 7-sifers befetsje nûmers of net.

    Tips:

    • De func tion kin ynfoege wurde direkt yn in sel fia it standert dialoochfinster Funksje ynfoegje , dêr't it yn kategorisearre is ûnder AblebitsUDFs .
    • Standert wurdt in reguliere útdrukking tafoege oan de formule, mar jo kinne ek bewarje it yn in aparte sel. Brûk hjirfoar gewoan in selferwizing foar it 2e argumint.
    • Standert is de funksje hoofdlettergefoel . Foar haadletter-ûngefoelige oerienkomst, brûk it (?i) patroan.

    Foar mear ynformaasje, sjoch asjebleaft AblebitsRegexMatch-funksje.

    Dat is hoe't jo reguliere ekspresje-oerienkomst kinne dwaan yn Excel. Ik tankje jo foar it lêzen en sjoch út nei jo te sjen op ús blog nije wike!

    Beskikbere downloads

    Excel Regex Match foarbylden (.xlsm triem)

    Ultimate Suite 14- day folslein funksjonele ferzje (.exe-bestân)

    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 iInputTourColnRegInn. .Cells(iInputCurRow, iInputCurCol).Value) Folgjende Folgjende RegExpMatch = arRes Útgongsfunksje ErrHandl: RegExpMatch = CVErr(xlErrValue) Einfunksje

    Paste de koade yn de VBA-bewurker, en jo nije RegExpMatch -funksje is klear foar gebrûk. As jo ​​net folle ûnderfining hawwe mei VBA, kin dizze gids nuttich wêze: Hoe kinne jo VBA-koade yn Excel ynfoegje.

    Opmerking. Nei it ynfoegjen fan de koade, tink om jo bestân te bewarjen as in makro-ynskeakele wurkboek (.xlsm).

    RegExpMatch-syntaksis

    De funksje RegExpMatch kontrolearret oft in diel fan 'e boarnestring oerienkomt mei in reguliere ekspresje. It resultaat is in Booleaanske wearde: TRUE as op syn minst ien oerienkomst fûn wurdt, FALSE oars.

    Us oanpaste funksje hat 3 arguminten - de earste twa binne ferplicht en de lêste is opsjoneel:

    RegExpMatch(tekst , patroan, [match_case])

    Wêr:

    • Tekst (ferplicht) - ien of mear tekenrige om yn te sykjen. Kin wurde levere as in sel- of berikferwizing.
    • Patroan (ferplicht) - de reguliere ekspresje dy't oerienkomt. Wannear't direkt yn in formule pleatst wurdt, moat in patroan ynsletten wurde yn dûbele oanhalingstekens.
    • Match_case (opsjoneel) - definiearret de wedstriidtype. As TRUE of weilitten (standert), wurdt case-sensitive matching útfierd; if FALSE - case-insensitive.

    De funksje wurket yn alle ferzjes fan Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 en Excel 2010.

    3 dingen dy't jo moatte witte oer RegExpMatch

    Foardat wy by praktyske berekkeningen komme, nim dan omtinken oan de folgjende punten dy't guon technyske punten ferdúdlikje:

    1. De funksje kin in ienkele sel ferwurkje of berik fan sellen . Yn it lêste gefal wurde de resultaten weromjûn yn 'e oanbuorjende sellen yn' e foarm fan in dynamyske array, of spillbereik, lykas werjûn yn dit foarbyld.
    2. Standert is de funksje hoofdlettergefoel . Om tekstfallen te negearjen, set it argumint match_case op FALSE. Fanwegen de beheiningen fan VBA Regexp wurdt it gefal-ûngefoelige patroan (?i) net stipe.
    3. As in jildich patroan net fûn wurdt, jout de funksje FALSE werom; as it patroan ûnjildich is , in #VALUE! error occurs.

    Hjirûnder fine jo in pear foarbylden fan regex-oerienkomsten dy't makke binne foar demonstraasjedoelen. Wy kinne net garandearje dat ús patroanen feilloos sille wurkje mei in breder skala oan ynfiergegevens yn jo echte wurkblêden. Foardat jo produksje ynstelle, wês der wis fan dat jo ús samplepatroanen testen en oanpasse neffens jo behoeften.

    Hoe kinne jo regex brûke om stringen yn Excel te passen

    As alle snaren dy't jo oerienkomme wolle, hawwe de itselde patroan,reguliere útdrukkingen binne in ideale oplossing.

    Stel dat jo in ferskaat oan sellen hawwe (A5:A9) mei ferskate details oer guon items. Jo wolle witte hokker sellen SKU's hawwe. Oannommen dat elke SKU bestiet út 2 haadletters, in koppelteken en 3 sifers, kinne jo se oerienkomme mei de folgjende útdrukking.

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

    Dêr't [A-Z]{2} alle 2 haadletters fan A oant Z betsjut en \d{3} elke 3 sifers fan 0 oant 9 betsjut. It \b-karakter jout in wurd oan grins, wat betsjuttet dat in SKU in apart wurd is, en gjin diel fan in gruttere tekenrige lykas 23-MAR-2022.

    Mei it fêststelde patroan kinne wy ​​trochgean mei it skriuwen fan in formule. Yn essinsje is it brûken fan in oanpaste funksje net oars as in lânseigen. Sadree't jo begjinne mei it typen fan in formule, sil de namme fan de funksje ferskine yn 'e list foarsteld troch Excel's AutoComplete. D'r binne lykwols in pear nuânses yn Dynamic Array Excel (Microsoft 365 en Excel 2021) en tradysjonele Excel (2019 en âldere ferzjes).

    Trije oerienkomme mei ien sel

    Om in tekenrige te passen. yn ien sel, ferwize nei dy sel yn it earste argumint. It twadde argumint moat in reguliere ekspresje befetsje.

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

    It patroan kin ek bewarre wurde yn in foarbepaalde sel, dy't beskoattele is mei in absolute referinsje ($A$2):

    =RegExpMatch(A5, $A$2)

    Nei it ynfieren fan de formule yn de earste sel, kinne jo dizze nei alle oare rigen slepe.

    Dizze metoadewurket prachtich yn alle Excel-ferzjes .

    Stringen yn meardere sellen tagelyk oerienkomme

    Om meardere snaren mei ien formule te passen, befetsje in berikferwizing yn it earste argumint:

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

    Yn Excel 365 en Excel 2021 dy't dynamyske arrays stypje, wurket it op dizze manier - jo typ de formule yn 'e earste sel, druk op Enter, en de formule spilet automatysk yn 'e ûndersteande sellen.

    Yn Excel 2019 en earder, it wurket allinich as in tradisjonele CSE-arrayformule, dy't yn in berik fan sellen ynfierd wurdt en foltôge wurdt troch de Ctrl + Shift + Enter-toetsen tegearre yn te drukken.

    Regex om nûmer te passen

    Om ien inkeld sifer fan 0 oant 9 te passen, brûk it \d -teken yn 'e regex. Ofhinklik fan jo bepaalde taak, foegje in geskikte kwantifikaasjetoets ta of meitsje in komplekser patroan.

    Regex om elk getal te passen

    Om elk nûmer fan elke lingte te passen, set de + kwantifisearing direkt nei de / d karakter, dat seit om te sykjen nei nûmers mei 1 of mear sifers.

    Patroan : \d+

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

    Regex om oerien te kommen mei it oantal spesifike lingte

    As jo ​​doel is om numerike wearden te oerienkomme mei in bepaald oantal sifers, brûk dan \d tegearre mei in passende kwantifisearder.

    Bygelyks, om faktuernûmers te oerienkomme mei krekt 7 sifers, soene jo \d{7} brûke. Hâld lykwols yn gedachten dat it oerienkomt mei 7lykas ferwachte:

    Opmerkingen:

    • Ynternasjonale koades wurde net kontrolearre, dus se kinne wol of net oanwêzich wêze.
    • Yn reguliere útdrukkingen stiet \s foar elk wite-romte-karakter, lykas in spaasje, ljepper, karre werom, of nije rigel. Om allinnich spaasjes ta te stean, brûk [-\. ] ynstee fan [-\.\s].
    • Regex to NOT match character

      Om stringen te finen dy't NET in bepaald karakter befetsje, kinne jo negearre karakterklassen brûke [^ ] dy't oerienkomme alles NET yn heakjes. Bygelyks:

      • [^13] sil oerienkomme mei elk inkeld karakter dat net 1 of 3 is.
      • [^1-3] sil oerienkomme mei elk inkeld karakter dat net 1 is, 2 of 3 (d.w.s. elk sifer fan 1 oant 3).

      Stel dat jo yn in list mei telefoannûmers dejinge wolle fine dy't gjin lânkoade hawwe. Tink derom dat elke ynternasjonale koade it + teken befettet, kinne jo de karakterklasse [^\+] brûke om stringen te finen dy't gjin plusteken befetsje. It is wichtich om te realisearjen dat de boppesteande útdrukking oerienkomt mei elk inkeld karakter dat net + is. Om't in telefoannûmer oeral yn in tekenrige kin wêze, net needsaaklik yn it begjin, wurdt de * kwantifier tafoege om elk folgjende karakter te kontrolearjen. De start ^ en ein $ ankers soargje derfoar dat de hiele tekenrige wurdt ferwurke. As resultaat krije wy de ûndersteande reguliere ekspresje dy't seit "kom net oerien mei it + karakter op elke posysje yn 'e tekenrige".

      Patroan :^[^\+]*$

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

      Regex om NET oerien te kommen mei tekenrige

      Al is d'r gjin spesjale reguliere ekspresjesyntaksis foar net oerienkomme mei in spesifike tekenrige, kinne jo dit gedrach emulearje troch in negative lookahead te brûken.

      Stel dat jo snaren fine wolle dy't net befetsje it wurd "citroenen". Dizze reguliere ekspresje sil in traktaasje wurkje:

      Patroan : ^((?!sitroenen).)*$

      Fansels is hjir wat útlis nedich. De negative lookahead (?!citroenen) sjocht nei rjochts om te sjen oft der gjin wurd "sitroenen" foarút is. As "citroenen" der net is, dan komt de stip oerien mei elk karakter útsein in rigelbreuk. De boppesteande útdrukking fiert mar ien kontrôle út, en de * kwantifier werhellet it nul of mear kearen, fan it begjin fan 'e tekenrige ferankere troch ^ oant it ein fan' e tekenrige ferankere troch $.

      Om de tekstcase te negearjen, wy sette it 3e argumint op FALSE om ús funksje hoofdlettergefoel te meitsjen:

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

      Tips en notysjes:

      • De boppesteande regex wurket allinich foar single-line snaren. Yn gefal fan milti-line-strings komme de ^ en $-tekens oerien mei it begjin en ein fan elke rigel yn stee fan it begjin en ein fan de ynfierstring, dêrom siket de regex allinnich yn de earste rigel.
      • Om stringen dy't net begjinne mei bepaalde tekst oerienkomme, brûk dan in reguliere útdrukking lykas ^(?!lemons).*$
      • Om stringen dy't net einigje mei bepaalde tekst oerienkomme, befetsjede einstring anker yn it sykpatroan: ^((?!lemons$).)*$

      Case-unsensitive matching

      Yn klassike reguliere útdrukkingen is der in spesjaal patroan foar case-insensitive matching (?i), dat wurdt net stipe yn VBA RegExp. Om dizze beheining te oerwinnen, akseptearret ús oanpaste funksje it 3e opsjonele argumint mei de namme match_case . Om net-gefoelige matching te dwaan, set it gewoan op FALSE.

      Litte wy sizze dat jo datums identifisearje wolle lykas 1-MAR-22 of 01-MAR-2022. Om de formaten dd-mmm-yyyy en d-mmm-yy te passen, brûke wy de folgjende reguliere ekspresje.

      Patroan : \b\d{1,2}-(Jansifers oeral yn 'e tekenrige ynklusyf in nûmer fan 10 of 100 sifers. As dit net is wat jo sykje, set dan de wurdgrins \b oan beide kanten.

      Patroan : \b\d{7}\b

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

      Regex om telefoannûmers te passen

      Om't telefoannûmers yn ferskate formaten skreaun wurde kinne, fereasket it oerienkomme mei in mear ferfine reguliere ekspresje.

      Yn de ûnderste dataset sille wy sykje nei 10-sifers nûmers dy't 3 sifers hawwe yn 'e earste 2 groepen en 4 sifers yn' e lêste groep. De groepen kinne skieden wurde mei in punt, koppelteken of spaasje. De earste groep kin al of net tusken heakjes ynsletten wurde.

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

    Michael Brown is in tawijd technology-entûsjast mei in passy foar it ferienfâldigjen fan komplekse prosessen mei software-ark. Mei mear as in desennium ûnderfining yn 'e tech-yndustry hat hy syn feardigens yn Microsoft Excel en Outlook, lykas Google Blêden en Docs, oanskerpe. Michael's blog is wijd oan it dielen fan syn kennis en ekspertize mei oaren, en biedt maklik te folgjen tips en tutorials foar it ferbetterjen fan produktiviteit en effisjinsje. Oft jo in betûfte profesjonele of in begjinner binne, Michael's blog biedt weardefolle ynsjoch en praktysk advys om it measte út dizze essensjele software-ark te heljen.