Excel Regex: sobitamine stringidega, kasutades regulaarseid väljendeid

  • Jaga Seda
Michael Brown

Selles õpetuses vaatleme põhjalikult, kuidas kasutada regexi, et sobitada stringid Excelis.

Kui teil on vaja leida teatud väärtus rakkude vahemikust, kasutate funktsiooni MATCH või XMATCH. Kui otsite konkreetset stringi rakus, tulevad appi funktsioonid FIND ja SEARCH. Ja kuidas te teate, kas lahter sisaldab teavet, mis vastab antud mustrile? Ilmselt, kasutades regulaaravaldisi. Aga algselt ei toeta Excel regexe! Ei muret, me sunnime seda tegema :)

    Exceli VBA Regex funktsioon stringide sobitamiseks

    Nagu pealkirjast üsna selgeks saab, tuleb regulaaravaldiste kasutamiseks Excelis luua oma funktsioon. Õnneks on Exceli VBA-s sisseehitatud RegExp objekti, mida saate kasutada oma koodis, nagu allpool näidatud:

    Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'massiivi tulemuste salvestamiseks Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'lähtekoha praeguse rea indeks, lähtekoha praeguse veeru indeks, ridade arv, veergude arv 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

    Sisestage kood VBA redaktorisse ja teie uus RegExpMatch funktsioon on kasutusvalmis. Kui te ei ole VBAga väga kogenud, võib see juhend olla abiks: Kuidas sisestada VBA-koodi Excelis.

    Märkus. Pärast koodi sisestamist ärge unustage salvestada oma faili kui makrotoimingutega töövihik (.xlsm).

    RegExpMatch süntaks

    The RegExpMatch funktsioon kontrollib, kas mõni osa lähtekirje stringist vastab regulaaravaldisele. Tulemuseks on boolilik väärtus: TRUE, kui leitakse vähemalt üks vaste, vastasel juhul FALSE.

    Meie kohandatud funktsioonil on 3 argumenti - kaks esimest on kohustuslikud ja viimane on valikuline:

    RegExpMatch(text, pattern, [match_case])

    Kus:

    • Tekst (nõutav) - üks või mitu stringi, milles otsitakse. Võib esitada lahtri või vahemiku viitena.
    • Muster (nõutav) - regulaarväljend, millele tuleb sobitada. Kui muster paigutatakse otse valemisse, peab see olema ümbritsetud kahekordsete jutumärkide sisse.
    • Match_case (valikuline) - määrab sobitamise tüübi. Kui TRUE või jäetakse välja (vaikimisi), tehakse suur- ja väiketähtedega sobitamine; kui FALSE - suur- ja väiketähtedeta.

    Funktsioon töötab kõigis Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 ja Excel 2010 versioonides.

    3 asja, mida peaksite teadma RegExpMatchist

    Enne praktiliste arvutuste juurde asumist palume tähele panna järgmisi punkte, mis selgitavad mõningaid tehnilisi üksikasju:

    1. Funktsioon võib töödelda üksiku raku või rakkude vahemik Viimasel juhul tagastatakse tulemused naaberruutudes dünaamilise massiivi või väljavooluala kujul, nagu on näidatud selles näites.
    2. Vaikimisi on funktsioon suur- ja väiketähelepanu Teksti suurust ignoreerida, seadistage match_case argumenti FALSE. VBA Regexp piirangute tõttu ei toetata suur- ja väiketähelepanuta mustrit (?i).
    3. Kui kehtivat mustrit ei leita, tagastab funktsioon FALSE; kui aga muster on kehtetu tekib #VALUE! viga.

    Allpool leiate mõned regexi sobitamise näited, mis on loodud demonstratsiooni eesmärgil. Me ei saa garanteerida, et meie mustrid töötavad veatult laiema hulga sisendandmete puhul teie reaalsetes töölehtedes. Enne tootmisse laskmist testige ja kohandage kindlasti meie näidismustreid vastavalt oma vajadustele.

    Kuidas kasutada regexi, et sobitada stringid Excelis

    Kui kõik stringid, mida soovite sobitada, on sama mustriga, on regulaaravaldised ideaalne lahendus.

    Oletame, et teil on hulk lahtreid (A5:A9), mis sisaldavad erinevaid andmeid mõnede kaupade kohta. Soovite teada, millistes lahtrites on SKU-d. Eeldades, et iga SKU koosneb kahest suurest tähest, sidekriipsust ja kolmest numbrist, saate neid sobitada järgmise väljendi abil.

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

    Kus [A-Z]{2} tähendab mis tahes 2 suurt tähte A-st Z-ni ja \d{3} tähendab mis tahes 3 numbrit 0-st 9-ni. \b märk tähistab sõnapiiri, mis tähendab, et SKU on eraldi sõna, mitte osa suuremast stringist, näiteks 23-MAR-2022.

    Kui muster on loodud, võime liikuda edasi valemi kirjutamise juurde. Põhimõtteliselt ei erine kohandatud funktsiooni kasutamine emakeelse funktsiooni kasutamisest. Niipea, kui hakkate valemit kirjutama, ilmub funktsiooni nimi Exceli automaatse täitmise pakutavasse loendisse. Siiski on Dynamic Array Excelis (Microsoft 365 ja Excel 2021) ja traditsioonilises Excelis (2019 ja vanemad versioonid) mõned nüansid.

    Sobitamine string ühes lahtris

    Kui soovite sobitada stringi ühes lahtris, viidake sellele lahtrile esimeses argumendis. Teine argument peaks sisaldama regulaaravaldist.

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

    Mustrit saab hoida ka eelnevalt määratud lahtris, mis on lukustatud absoluutse viitega ($A$2):

    =RegExpMatch(A5, $A$2)

    Pärast valemi sisestamist esimesse lahtrisse saate selle alla lohistada kõikidesse teistesse ridadesse.

    See meetod töötab suurepäraselt kõik Exceli versioonid .

    Sobitamine stringid mitmes lahtris korraga

    Mitme stringi sobitamiseks ühe valemiga lisage esimeses argumendis vahemikuviide:

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

    Veebilehel Excel 365 ja Excel 2021 mis toetavad dünaamilisi massiive, toimib see nii - sisestate valemi esimesse lahtrisse, vajutate Enter ja valem valgub automaatselt allolevatesse lahtritesse.

    Veebilehel Excel 2019 ja varem töötab see ainult traditsioonilise CSE massiivi valemina, mis sisestatakse lahtrite vahemikku ja täidetakse klahvide Ctrl + Shift + Enter koos vajutamisega.

    Regex sobitada number

    Iga üksiku numbri 0 kuni 9 sobitamiseks kasutage sümbolit \d sõltuvalt teie konkreetsest ülesandest, lisage sobiv kvantifikaator või koostage keerulisem muster.

    Regex, mis vastab mis tahes numbrile

    Kui soovite sobitada mis tahes pikkusega numbreid, pange kvantifikaator + kohe pärast märki /d, mis ütleb, et otsitakse numbreid, mis sisaldavad 1 või rohkem numbrit.

    Muster : \d+

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

    Regex, mis vastab konkreetse pikkusega numbrile

    Kui teie eesmärk on sobitada numbrilisi väärtusi, mis sisaldavad teatud arvu numbreid, siis kasutage \d koos sobiva kvantifikaatoriga.

    Näiteks täpselt 7-kohalistest numbritest koosnevate arvunumbrite sobitamiseks kasutate \d{7}. Pidage aga meeles, et see sobib 7-kohalise numbriga ükskõik kus, sealhulgas 10-kohalise või 100-kohalise numbriga. Kui see ei ole see, mida te otsite, siis pange sõnapiiritus \b mõlemale poole.

    Muster : \b\d\7}\b

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

    Regex telefoninumbrite sobitamiseks

    Kuna telefoninumbrid võivad olla kirjutatud erinevates formaatides, nõuab nende sobitamine keerukamat regulaaravaldist.

    Allpool esitatud andmestikus otsime 10-kohalisi numbreid, mille kahes esimeses rühmas on 3 numbrit ja viimases rühmas 4 numbrit. Rühmad võivad olla eraldatud punkti, sidekriipsu või tühikuga. Esimene rühm võib olla sulgudes või mitte.

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

    Selle regulaaravaldise lahtimõtestamisel saame järgmise tulemuse:

    • Esimene osa (\(\d{3}\)
    • Osa [-\.\s]? tähendab 0 või 1 sümboli esinemist nurksulgudes: sidekriips, punkt või tühik.
    • Seejärel on veel üks 3-kohaline rühm d{3}, millele järgneb ükskõik milline sidekriips, punkt või tühik [\-\.\s]?, mis esineb 0 või 1 korda.
    • Viimasele 4 numbrile \d{4} järgneb sõnapiir \b, et teha selgeks, et telefoninumber ei saa olla osa suuremast numbrist.

    Kui algne string on A5 ja regulaaravaldis A2, siis valem on järgmine:

    =RegExpMatch(A5, $A$2)

    ... ja töötab täpselt nii, nagu oodatud:

    Märkused:

    • Rahvusvahelisi koode ei ole kontrollitud, seega võivad need olemas olla või mitte.
    • Regulaaravaldistes tähistab \s mis tahes tühikut, näiteks tühikut, tabulaatorit, vagunitagasi või uut rida. Kui soovite lubada ainult tühikuid, kasutage [-\. ] asemel [-\.\s].
    • Regex, et mitte sobitada märki

      Selleks, et leida stringid, mis EI sisalda teatud märki, saate kasutada eitavaid märgiklasse [^ ], mis sobivad kõigega, mis EI ole sulgudes. Näiteks:

      • [^13] vastab igale üksikule tähemärgile, mis ei ole 1 või 3.
      • [^1-3] vastab igale üksikule tähemärgile, mis ei ole 1, 2 või 3 (st mis tahes numbrile vahemikus 1 kuni 3).

      Oletame, et soovite leida telefoninumbrite nimekirjast need, millel ei ole riigikoodi. Pidades silmas, et iga rahvusvaheline kood sisaldab +-märki, saate kasutada märgiklassi [^\+], et leida stringid, mis ei sisalda plussmärki. Oluline on mõista, et ülaltoodud väljend vastab igale üksikule märgile, mis ei ole +. Kuna telefoninumber võib olla ükskõik kus stringis, ei oletingimata kohe alguses lisatakse kvantifikaator *, et kontrollida iga järgnevat märki. Alguse ^ ja lõpu $ ankurdajad tagavad, et töödeldakse kogu stringi. Tulemusena saame alljärgneva regulaaravaldise, mis ütleb "ei vasta + märgile üheski positsioonis stringis".

      Muster : ^[^\+]*$

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

      Regex, mis EI vasta stringile

      Kuigi ei ole olemas spetsiaalset regulaaravaldise süntaksit, et mitte sobitada konkreetset stringi, saab seda käitumist emuleerida, kasutades negatiivset lookahead'i.

      Oletame, et soovite leida stringid, mis ei sisalda sõna "sidrunid". See regulaaravaldis töötab suurepäraselt:

      Muster : ^((?!sidrunid).)*$

      Ilmselt on siinkohal vaja mõningaid selgitusi. Negatiivne lookahead (?!lemons) vaatab paremale, et näha, kas ees ei ole sõna "lemons". Kui "lemons" ei ole seal, siis vastab punkt mis tahes märgile peale reavahetuse. Ülaltoodud väljend teeb ainult ühe kontrolli ja kvantifikaator * kordab seda nulli või rohkem korda, alates ^-ga ankurdatud stringi algusest kuni ^-ga ankurdatud stringi lõpuni.$.

      Et ignoreerida teksti suurust, seame 3. argumendi väärtuseks FALSE, et muuta meie funktsioon suurust mitte arvestavaks:

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

      Näpunäited ja märkused:

      • Ülaltoodud regex töötab ainult ühejooneline stringid. Milti-realise stringide puhul vastavad märgid ^ ja $ sisendstringi alguse ja lõpu asemel iga rea algusele ja lõpule, mistõttu regex otsib ainult esimeses reas.
      • Et sobitada stringid, mis mitte alustada teatava tekstiga , kasutage regulaaravaldist, näiteks ^(?!sidrunid).*$
      • Et sobitada stringid, mis ei lõpe teatava tekstiga , lisage otsingumustrisse ka otsingustringi ankur: ^(((?!sidrunid$).)*$

      Suur- ja väiketähtede tundmatu sobitamine

      Klassikalistes regulaaravaldistes on olemas spetsiaalne muster suur- ja väiketähelepanuta sobitamise jaoks (?i), mida VBA RegExp ei toeta. Selle piirangu ületamiseks võtab meie kohandatud funktsioon vastu 3. valikulise argumendi nimega match_case Suur- ja väiketähtedeta sobitamise tegemiseks seadke selle väärtuseks lihtsalt FALSE.

      Oletame, et soovite tuvastada selliseid kuupäevi nagu 1-märts-22 või 01-märts-2022. Et sobitada dd-mmm-yyyy ja d-mmm-yy formaadid, kasutame järgmist regulaaravaldist.

      Muster : \b\d{1,2}-(Jan

      Meie väljendus otsib 1 või 2 numbrist koosnevat rühma, millele järgneb sidekriips, millele järgneb mõni kuu lühend, mis on eraldatud tähtedega

      Miks mitte kasutada lihtsamat mustrit nagu \d{1,2}-[A-Za-z]{3}-\d{2,4}\b? Et vältida valepositiivseid vasteid nagu 01-ABC-2020.

      Sisestage muster A2 ja saate järgmise valemi:

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

      Regex kehtivate e-posti aadresside sobitamiseks

      Nagu üldiselt teada, koosneb e-posti aadress neljast osast: kasutajanimi, sümbol @, domeeninimi (postiserver) ja tippdomeen (näiteks .com, .edu, .org jne). Selleks, et kontrollida e-posti aadressi kehtivust, peame reprodutseerima ülaltoodud struktuuri regulaaravaldiste abil.

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

      Et paremini mõista, mis siin toimub, vaatame iga osa lähemalt:

      • Kasutajanimi võib sisaldada tähti, numbreid, alatähti, punkte ja sidekriipsu. Pidades silmas, et \w sobib mis tahes tähega, numbriga või alatähisega, saame järgmise regexi: [\w\.\-]+
      • Domeeninimi võib sisaldada suur- ja väiketähti, numbreid, sidekriipsu (kuid mitte esimeses või viimases positsioonis) ja punkte (alamdomeenide puhul). Kuna allkriipsud ei ole lubatud, kasutame \w asemel 3 erinevat tähemärki: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+[A-Za-z0-9]+.
      • Tippdomeen koosneb punktist, millele järgnevad suur- ja väiketähed. See võib sisaldada 2 kuni 24 tähte (pikim praegu olemasolev TLD): \.[A-Za-z]{2,24}

      Märkus. Muster eeldab, et domeeninimi sisaldab 2 või enam tähtnumbrilist märki.

      Kui originaaltekst on A5 ja muster A5, võtab valem sellise kuju:

      =RegExpMatch(A5, $A$2)

      Või võite kasutada e-posti valideerimiseks lihtsamat regulaaravaldist, milles on kas väike- või suurtähtede kogum:

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

      Kuid tehke oma valemiga suur- ja väiketähelepanuta:

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

      Exceli IF-vormel koos sobiva regexiga

      Kuna sisseehitatud ja kohandatud funktsioonid sobivad hästi kokku, ei takista miski nende ühist kasutamist ühes valemis.

      Selleks, et tagastada või arvutada midagi, kui regulaaravaldis vastab, ja midagi muud, kui see ei vasta, põimige kohandatud RegExpMatch-funktsioon IF-i loogilisse teksti:

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

      Näiteks, kui string A5 sisaldab kehtivat e-posti aadressi, saate tagastada "Jah", vastasel juhul "Ei".

      =IF(RegExpMatch(A5, $A$2,), "Jah", "Ei")

      Loeb, kui regex vastab

      Kuna Exceli algupärased funktsioonid ei toeta regulaarseid väljendeid, ei ole võimalik regexi otse funktsiooni COUNTIS või COUNTIFS sisestada. Õnneks saate seda funktsiooni emuleerida, kasutades meie kohandatud funktsiooni.

      Oletame, et olete kasutanud regexi, et sobitada telefoninumbreid ja väljastada tulemused veerus B. Et teada saada, mitu lahtrit sisaldavad telefoninumbreid, peate lihtsalt lugema TRUE väärtused B5:B9. Ja seda saab hõlpsasti teha, kasutades standardset COUNTIF valemit:

      =COUNTIF(B5:B9, TRUE)

      Sa ei taha oma töölehel mingeid täiendavaid veerge? Pole probleemi. Pidades silmas, et meie kohandatud funktsioon võib töödelda korraga mitut lahtrit ja Exceli SUM saab massiivi väärtusi kokku liita, siis teete järgmist:

      • Andke RegExpMatchile vahemiku viide, nii et see tagastab TRUE ja FALSE väärtuste massiivi.
      • Kasutage topeltnegatsiooni (--), et sundida loogilised väärtused ühikuteks ja nullideks.
      • Hangi funktsioon SUM, et liita saadud massiivi 1 ja 0 väärtused kokku.

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

      Regexi sobitamine Ultimate Suite'iga

      Meie Ultimate Suite'i kasutajad saavad kasutada nelja võimsat Regex-funktsiooni ilma VBA-koodi lisamata oma töövihikutesse, kuna need on lisainstallatsiooni ajal sujuvalt Excelisse integreeritud. Meie kohandatud funktsioone töötleb standardne .NET RegEx-mootor ja toetab täisfunktsionaalsed klassikalised regulaaravaldised.

      Kuidas kasutada kohandatud RegexMatch funktsiooni

      Eeldades, et teil on paigaldatud Ultimate Suite'i uusim versioon (2021.4 või uuem), saate luua Regex Matchi valemi kahe lihtsa sammuga:

      1. On Ablebits andmed vahekaardil Tekst rühma, klõpsake Regex tööriistad .

    • On Regex tööriistad paneelil tehke järgmist:
    • Hetk hiljem on AblebitsRegexMatch funktsioon sisestatakse uude veergu, mis asub teie andmetest paremal.

      Allpool esitatud ekraanipildil kontrollib funktsioon, kas veerus A olevad stringid sisaldavad 7-kohalisi numbreid või mitte.

      Näpunäited:

      • Funktsioon võib olla sisestatud otse lahtrisse Standardi kaudu Sisestage funktsioon dialoogiaknas, kus see on kategoriseeritud kategooriasse AblebitsUDFs .
      • Vaikimisi lisatakse regulaaravaldis valemile, kuid te võite seda hoida ka eraldi lahtris. Selleks kasutage 2. argumendiks lihtsalt lahtriviidet.
      • Vaikimisi on funktsioon suur- ja väiketähelepanu Suur- ja väiketähtedest sõltumatu sobitamise puhul kasutage mustrit (?i).

      Lisateavet leiate funktsioonist AblebitsRegexMatch.

      See on, kuidas teha regulaaravaldiste sobitamist Excelis. Tänan teid lugemise eest ja ootan teid järgmisel nädalal meie blogis!

      Saadaolevad allalaadimised

      Excel Regex Match näited (.xlsm fail)

      Ultimate Suite 14-päevane täisfunktsionaalne versioon (.exe fail)

    Michael Brown on pühendunud tehnoloogia entusiast, kelle kirg on tarkvaratööriistade abil keerukate protsesside lihtsustamine. Rohkem kui kümneaastase kogemusega tehnoloogiatööstuses on ta lihvinud oma oskusi Microsoft Excelis ja Outlookis, samuti Google Sheetsis ja Docsis. Michaeli ajaveebi eesmärk on jagada oma teadmisi ja teadmisi teistega, pakkudes hõlpsasti järgitavaid näpunäiteid ja õpetusi tootlikkuse ja tõhususe parandamiseks. Olenemata sellest, kas olete kogenud professionaal või algaja, pakub Michaeli ajaveebi väärtuslikke teadmisi ja praktilisi nõuandeid nende oluliste tarkvaratööriistade maksimaalseks kasutamiseks.