Excel Regex: karakterláncok egyeztetése szabályos kifejezésekkel

  • Ossza Meg Ezt
Michael Brown

Ebben a bemutatóban részletesen megnézzük, hogyan használhatjuk a regexet az Excelben a karakterláncok egyezéséhez.

Amikor egy bizonyos értéket kell keresni egy cellatartományban, akkor a MATCH vagy az XMATCH funkciót használjuk. Amikor egy adott karakterláncot keresünk egy cellában, akkor a FIND és a SEARCH funkciók jönnek jól. És honnan tudjuk, hogy egy cella tartalmaz-e olyan információt, amely megfelel egy adott mintának? Nyilvánvalóan a reguláris kifejezések használatával. De az Excel alapból nem támogatja a regexeket! Ne aggódjon, majd mi rákényszerítjük :)

    Excel VBA Regex funkció a karakterláncok egyezéséhez

    Ahogy az a címből is kiderül, ahhoz, hogy szabályos kifejezéseket használhassunk az Excelben, saját függvényt kell létrehoznunk. Szerencsére az Excel VBA-jának van egy beépített RegExp objektumot, amelyet az alábbi módon használhatsz a kódodban:

    Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'tömb az eredmények tárolására Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'az aktuális sor indexe a forrás tartományban, az aktuális oszlop indexe a forrás tartományban, a sorok száma, az oszlopok száma On Error GoTo ErrHandl.RegExpMatch = 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

    Illessze be a kódot a VBA-szerkesztőbe, és az új RegExpMatch funkció készen áll a használatra. Ha nem rendelkezik nagy tapasztalattal a VBA-ban, ez az útmutató hasznos lehet: Hogyan illesszünk be VBA-kódot az Excelbe.

    Megjegyzés: A kód beillesztése után ne felejtse el elmenteni a fájlját makroképes munkafüzet (.xlsm).

    RegExpMatch szintaxis

    A RegExpMatch függvény ellenőrzi, hogy a forrás karakterlánc bármely része megfelel-e egy reguláris kifejezésnek. Az eredmény egy bóluszi érték: TRUE, ha legalább egy találat van, egyébként FALSE.

    Az egyéni függvényünknek 3 argumentuma van - az első kettő kötelező, az utolsó pedig opcionális:

    RegExpMatch(text, pattern, [match_case])

    Hol:

    • Szöveg (kötelező) - egy vagy több karakterlánc a kereséshez. Megadható cellahivatkozásként vagy tartományhivatkozásként.
    • Mintázat (kötelező) - az egyezni kívánt reguláris kifejezés. Ha közvetlenül egy képletbe kerül, a mintát idézőjelek közé kell zárni.
    • Match_case (opcionális) - meghatározza az egyezés típusát. Ha TRUE vagy elhagyja (alapértelmezett), akkor nagy- és kisbetű-érzékeny egyezés történik; ha FALSE - nagy- és kisbetű-érzéketlen.

    A funkció az Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 és Excel 2010 összes verziójában működik.

    3 dolog, amit a RegExpMatch-ről tudnia kell

    Mielőtt rátérnénk a gyakorlati számításokra, kérjük, vegye figyelembe a következő pontokat, amelyek tisztáznak néhány technikai kérdést:

    1. A függvény feldolgozhat egy egyetlen sejt vagy cellák tartománya Ez utóbbi esetben az eredmények a szomszédos cellákban egy dinamikus tömb vagy egy kiöntési tartomány formájában jelennek meg, ahogyan az ebben a példában látható.
    2. Alapértelmezés szerint a funkció case-sensitive A szöveg nagy- és kisbetűinek figyelmen kívül hagyásához állítsa be a match_case argumentumot FALSE-re. A VBA Regexp korlátozása miatt a nagy- és kisbetűket nem érzékelő minta (?i) nem támogatott.
    3. Ha nem talál érvényes mintát, a függvény FALSE-t ad vissza; ha a a minta érvénytelen , #VALUE! hiba lép fel.

    Az alábbiakban talál néhány regex egyezés példát, amelyek bemutató céllal készültek. Nem tudjuk garantálni, hogy a mintáink hibátlanul működnek a valós munkalapok bemeneti adatainak szélesebb skálájával. Mielőtt a termelésbe helyezné, mindenképpen tesztelje és igazítsa a mintáinkat az igényeinek megfelelően.

    Hogyan használhatja a regexet a karakterláncok illesztésére az Excelben?

    Ha az összes egyezni kívánt karakterláncnak ugyanaz a mintája, a reguláris kifejezések ideális megoldást jelentenek.

    Tegyük fel, hogy van egy cellatartomány (A5:A9), amely különböző adatokat tartalmaz néhány cikkről. Szeretné tudni, hogy mely cellák tartalmaznak SKU-kat. Feltételezve, hogy minden SKU 2 nagybetűből, egy kötőjelből és 3 számjegyből áll, a következő kifejezéssel tudja őket összevetni.

    Mintázat : \b[A-Z]{2}-\d{3}\b

    Ahol az [A-Z]{2} két nagybetűt jelent A-tól Z-ig, a \d{3} pedig három számjegyet 0-tól 9-ig. A \b karakter szóhatárt jelöl, ami azt jelenti, hogy az SKU egy külön szó, és nem része egy nagyobb karakterláncnak, mint például 23-MÁR-2022.

    A minta kialakításával áttérhetünk a képlet írására. Lényegében az egyéni függvény használata nem különbözik a natív függvényekétől. Amint elkezdünk beírni egy képletet, a függvény neve megjelenik az Excel automatikus kitöltése által javasolt listában. Van azonban néhány árnyalat a dinamikus tömbösített Excel (Microsoft 365 és Excel 2021) és a hagyományos Excel (2019 és régebbi verziók) között.

    Egy cellában lévő karakterlánc egyezése

    Ha egyetlen cellában lévő karakterláncot szeretne egyezni, az első argumentumban hivatkozzon az adott cellára. A második argumentumnak egy reguláris kifejezést kell tartalmaznia.

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

    A minta egy előre meghatározott cellában is tárolható, amely abszolút hivatkozással ($A$2) van lezárva:

    =RegExpMatch(A5, $A$2)

    Miután beírta a képletet az első cellába, az összes többi sorba is áthúzhatja.

    Ez a módszer gyönyörűen működik a minden Excel verzió .

    Egyszerre több cellában lévő karakterláncok egyezése

    Ha több karakterláncot szeretne egyetlen képlettel egyezni, az első argumentumban adjon meg egy tartományhivatkozást:

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

    A oldalon. Excel 365 és Excel 2021 amelyek támogatják a dinamikus tömböket, ez így működik - beírja a képletet az első cellába, megnyomja az Entert, és a képlet automatikusan átterjed az alatta lévő cellákra.

    A oldalon. Excel 2019 és korábban, csak hagyományos CSE tömbképletként működik, amelyet egy cellatartományba kell beírni, és a Ctrl + Shift + Enter billentyűk együttes lenyomásával kell befejezni.

    Regex a számmal való egyezéshez

    A 0 és 9 közötti bármelyik számjegy megfeleltetéséhez használja a \d karaktert a regexben. Az adott feladattól függően adjon hozzá egy megfelelő kvantort, vagy hozzon létre egy összetettebb mintát.

    Regex bármilyen számmal való egyezéshez

    Ha bármilyen hosszúságú számot szeretne keresni, tegye a + kvantort közvetlenül a /d karakter után, amely azt mondja, hogy az 1 vagy több számjegyet tartalmazó számokat keresse.

    Mintázat : \d+

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

    Regex egy adott hosszúságú számmal való egyezéshez

    Ha az a cél, hogy egy bizonyos számú számjegyet tartalmazó numerikus értékeket találjon, akkor használja a \d-t egy megfelelő kvantorral együtt.

    Például, ha pontosan 7 számjegyből álló számlaszámokra szeretne illeszkedni, akkor a \d{7}-t használja. Ne feledje azonban, hogy a 7 számjegyet a karakterláncban bárhol megtalálja, beleértve a 10 vagy 100 számjegyű számokat is. Ha nem ezt keresi, akkor tegye a \b szóhatárt mindkét oldalra.

    Mintázat : \b\d{7}\b

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

    Regex a telefonszámok egyezéséhez

    Mivel a telefonszámok különböző formátumokban íródhatnak, a megfeleltetésükhöz kifinomultabb reguláris kifejezésre van szükség.

    Az alábbi adatkészletben olyan 10 számjegyű számokat keresünk, amelyek első két csoportjában 3 számjegy van, az utolsó csoportban pedig 4 számjegy. A csoportok elválaszthatók ponttal, kötőjellel vagy szóközzel. Az első csoport zárójelben lehet, de lehet, hogy nem.

    Mintázat: (\(\(\d{3}\)

    Ha lebontjuk ezt a reguláris kifejezést, a következőt kapjuk:

    • Az első rész (\(\d{3}\)
    • A [-\.\s]? rész a szögletes zárójelben lévő bármely karakter 0 vagy 1 előfordulását jelenti: kötőjel, pont vagy szóköz.
    • Ezután még egy 3 számjegyből álló d{3} csoport következik, amelyet egy kötőjel, pont vagy szóköz követ [\-\.\s]? 0 vagy 1 alkalommal.
    • Az utolsó 4 számjegyből álló \d{4} csoportot egy \b szóhatár követi, hogy egyértelművé tegye, hogy a telefonszám nem lehet része egy nagyobb számnak.

    Az A5-ben lévő eredeti karakterlánccal és az A2-ben lévő reguláris kifejezéssel a képlet a következő formát ölti:

    =RegExpMatch(A5, $A$2)

    ... és pontosan az elvárásoknak megfelelően működik:

    Megjegyzések:

    • A nemzetközi kódokat nem ellenőrzik, így előfordulhat, hogy jelen vannak, de az is lehet, hogy nincsenek.
    • A reguláris kifejezésekben a \s bármely szóköz karaktert, például szóközt, tabulátort, kocsivisszatérést vagy új sort jelent. Ha csak szóközöket szeretne engedélyezni, használja a [-\. ] helyett a [-\.\s] szót.
    • Regex a NEM egyező karakterhez

      Olyan karakterláncok kereséséhez, amelyek NEM tartalmaznak egy bizonyos karaktert, használhatsz negált karakterosztályokat [^ ], amelyek minden olyan karakterre illeszkednek, amely NEM zárójelben van. Például:

      • A [^13] minden olyan karakterre illik, amely nem 1 vagy 3.
      • A [^1-3] minden olyan karakterre illik, amely nem 1, 2 vagy 3 (azaz bármely számjegy 1-3 között).

      Tegyük fel, hogy egy telefonszámok listájában azokat szeretnénk megtalálni, amelyek nem tartalmaznak országkódot. Ha szem előtt tartjuk, hogy minden nemzetközi kód tartalmazza a + jelet, akkor a [^\+] karakterosztály segítségével olyan karakterláncokat találhatunk, amelyek nem tartalmaznak plusz jelet. Fontos megjegyezni, hogy a fenti kifejezés minden olyan karakterre illik, amely nem +. Mivel egy telefonszám bárhol lehet egy karakterláncban, nem lehetszükségszerűen a legelején, a * kvantor hozzáadódik, hogy minden további karaktert ellenőrizzen. A kezdeti ^ és a végi $ horgonyok biztosítják, hogy a teljes karakterláncot feldolgozzuk. Ennek eredményeként az alábbi reguláris kifejezést kapjuk, amely azt mondja, hogy "ne illessze a + karaktert a karakterlánc egyetlen pozíciójában sem".

      Mintázat : ^[^\+]*$

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

      Regex a NEM egyező karakterlánchoz

      Bár nincs speciális reguláris kifejezés szintaxis arra, hogy egy adott karakterláncra ne illeszkedjen, negatív előretekintés használatával utánozhatja ezt a viselkedést.

      Tegyük fel, hogy olyan karakterláncokat akarunk találni, amelyek nem tartalmaznak a "citrom" szót. Ez a reguláris kifejezés remekül fog működni:

      Mintázat : ^((?!citromok).)*$

      Nyilvánvaló, hogy itt némi magyarázatra van szükség. A negatív előretekintés (?!citrom) jobbra néz, hogy nincs-e előtte a "citrom" szó. Ha a "citrom" nincs ott, akkor a pont bármelyik karakterrel megegyezik, kivéve a sortörést. A fenti kifejezés csak egy ellenőrzést végez, és a * kvantor ezt nulla vagy több alkalommal ismétli meg, a ^ által lehorgonyzott karakterlánc elejétől a ^ által lehorgonyzott karakterlánc végéig.$.

      A szöveg esetének figyelmen kívül hagyásához a 3. argumentumot FALSE értékre állítjuk, hogy a függvényünk ne legyen nagy- és kisbetű-érzékeny:

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

      Tippek és megjegyzések:

      • A fenti regex csak a egysoros A többsoros karakterláncok esetében a ^ és $ karakterek a bemeneti karakterlánc eleje és vége helyett az egyes sorok elejére és végére illeszkednek, ezért a regex csak az első sorban keres.
      • Olyan karakterláncok illesztéséhez, amelyek ne indítsd el bizonyos szöveggel , használjon egy reguláris kifejezést, például ^(?!citromok).*$
      • Olyan karakterláncok illesztéséhez, amelyek nem ér véget bizonyos szöveggel , a keresési mintába beilleszti a véglánc horgonyát: ^(((?!citrom$).)*$

      Nagy- és kisbetű-érzékeny párosítás

      A klasszikus reguláris kifejezésekben van egy speciális minta a nagy- és kisbetű-független megfeleltetésre (?i), amelyet a VBA RegExp nem támogat. Ennek a korlátozásnak a kiküszöbölésére az egyéni függvényünk elfogadja a 3. választható argumentumot, amelynek neve match_case A nagy- és kisbetű-érzékelés nélküli megfeleltetéshez egyszerűen állítsuk FALSE értékre.

      Tegyük fel, hogy olyan dátumokat szeretne azonosítani, mint 1-Mar-22 vagy 01-MAR-2022. A megfelelő dd-mmm-yyyyyy és d-mmm-yy formátumok esetében a következő reguláris kifejezést használjuk.

      Mintázat : \b\d{1,2}-(Jan

      Kifejezésünk 1 vagy 2 számjegyből álló csoportot keres, amelyet egy kötőjel követ, majd a hónapok bármelyik rövidítése, amelyet a

      Miért nem használ egy egyszerűbb mintát, például \d{1,2}-[A-Za-z]{3}-\d{2,4}\b? Az olyan hamis pozitív találatok elkerülése érdekében, mint a 01-ABC-2020.

      Írja be a mintát az A2-be, és a következő képletet kapja:

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

      Regex az érvényes e-mail címek megfeleltetésére

      Mint általában ismert, egy e-mail cím 4 részből áll: felhasználónév, @ szimbólum, domain név (levelező szerver) és felső szintű domain (mint például .com, .edu, .org, stb.). Az e-mail cím érvényességének ellenőrzéséhez a fenti struktúrát kell megismételnünk a reguláris kifejezések segítségével.

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

      Hogy jobban megértsük, mi folyik itt, nézzük meg közelebbről az egyes részeket:

      • Felhasználónév tartalmazhat betűket, számokat, aláhúzásokat, pontokat és kötőjeleket. Figyelembe véve, hogy a \w bármilyen betűvel, számmal vagy aláhúzással megegyezik, a következő regexet kapjuk: [\w\.\-]+
      • Domain név tartalmazhat kis- és nagybetűket, számjegyeket, kötőjeleket (de nem az első vagy utolsó pozícióban) és pontokat (aldomainek esetén). Mivel az aláhúzások nem engedélyezettek, \w helyett 3 különböző karakterkészletet használunk: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+[A-Za-z0-9]+
      • Felső szintű domain egy pontból áll, amelyet kis- és nagybetűk követnek. 2-től 24 betűig terjedhet (ez a jelenleg létező leghosszabb TLD): \.[A-Za-z]{2,24}

      Megjegyzés: A minta feltételezi, hogy a tartománynév 2 vagy több alfanumerikus karaktert tartalmaz.

      Ha az eredeti szöveg A5-ben, a minta pedig A5-ben van, a képlet a következő formát ölti:

      =RegExpMatch(A5, $A$2)

      Vagy használhat egy egyszerűbb szabályos kifejezést is az e-mail érvényesítéséhez, kis- vagy nagybetűs karakterkészlettel:

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

      De a képletet tegye nagy- és kisbetű-érzéketlenné:

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

      Excel IF-képlet a regex egyezéssel

      Mivel a beépített és az egyéni függvények jól kijönnek egymással, semmi sem akadályozza meg, hogy ezeket együtt használja egyetlen képletben.

      Ahhoz, hogy valamit visszaadjon vagy kiszámítson, ha egy reguláris kifejezés illeszkedik, és valami mást, ha nem illeszkedik, ágyazza be az IF logikai szövegébe az egyéni RegExpMatch függvényt:

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

      Például, ha az A5-ben lévő karakterlánc egy érvényes e-mail címet tartalmaz, akkor "Igen", ellenkező esetben "Nem" választ adhat vissza.

      =IF(RegExpMatch(A5, $A$2,), "Igen", "Nem")

      Számolja meg, ha a regex megfelel

      Mivel a natív Excel-funkciók nem támogatják a reguláris kifejezéseket, nem lehetséges egy regexet közvetlenül a COUNTIS vagy COUNTIFS függvénybe helyezni. Szerencsére ezt a funkciót emulálhatja az egyéni függvényünkkel.

      Tegyük fel, hogy egy regexet használtunk a telefonszámok keresésére, és az eredményeket a B oszlopban adtuk ki. Ahhoz, hogy megtudjuk, hány cella tartalmaz telefonszámokat, csak meg kell számolnunk a B5:B9 cellák TRUE értékeit. Ez könnyen elvégezhető a standard COUNTIF képlet segítségével:

      =COUNTIF(B5:B9, TRUE)

      Nem szeretne extra oszlopokat a munkalapon? Nem probléma. Ha szem előtt tartjuk, hogy az egyéni függvényünk egyszerre több cellát is képes feldolgozni, és az Excel SUM funkciója össze tudja adni az értékeket egy tömbben, akkor a következőt kell tennünk:

      • Adjon meg egy tartományhivatkozást a RegExpMatch-nak, így az TRUE és FALSE értékek tömbjét adja vissza.
      • A kettős negáció (--) használatával a logikai értékeket egyesekre és nullákra kényszeríthetjük.
      • A SUM függvényt a kapott tömbben lévő 1-es és 0-s értékek összeadásához.

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

      Regex megfeleltetés az Ultimate Suite segítségével

      Az Ultimate Suite felhasználói négy nagy teljesítményű Regex-funkciót használhatnak anélkül, hogy VBA-kódot kellene hozzáadniuk a munkafüzeteikhez, mivel a kiegészítő telepítése során zökkenőmentesen integrálódnak az Excelbe. Egyéni függvényeinket a szabványos .NET RegEx motor dolgozza fel, és támogatják a teljes körű klasszikus reguláris kifejezéseket.

      Hogyan használjuk az egyéni RegexMatch funkciót

      Feltételezve, hogy az Ultimate Suite legújabb verziója van telepítve (2021.4 vagy újabb), két egyszerű lépésben létrehozhat egy Regex Match képletet:

      1. A Ablebits adatok lapon, a Szöveg csoport, kattintson a Regex eszközök .

    • A Regex eszközök ablaktáblán a következőket tegye:
      • Válassza ki a forrás karakterláncokat.
      • Adja meg a mintát.
      • Válassza ki a Match opció.
      • Ha az eredményeket képletként, nem pedig értékként szeretné megkapni, válassza a Beillesztés képletként jelölőnégyzet.
      • Kattintson a Match gomb.

      Egy pillanattal később a AblebitsRegexMatch függvényt egy új oszlopba illesztjük be az adatok jobb oldalán.

      Az alábbi képernyőképen a függvény ellenőrzi, hogy az A oszlopban lévő karakterláncok tartalmaznak-e 7 számjegyű számokat vagy sem.

      Tippek:

      • A funkció lehet beillesztett közvetlenül egy cellában a szabványos Beillesztési funkció párbeszédpanelen, ahol a AblebitsUDFs .
      • Alapértelmezés szerint a reguláris kifejezés hozzáadódik a képlethez, de külön cellában is tarthatja. Ehhez csak használjon cellahivatkozást a 2. argumentumhoz.
      • Alapértelmezés szerint a funkció case-sensitive Nagy- és kisbetűket nem érzékelő párosításhoz használja a (?i) mintát.

      További információért lásd az AblebitsRegexMatch funkciót.

      Így végezhetünk szabályos kifejezés megfeleltetést Excelben. Köszönöm, hogy elolvastad, és várom, hogy jövő héten találkozzunk a blogunkon!

      Elérhető letöltések

      Excel Regex Match példák (.xlsm fájl)

      Ultimate Suite 14 napos, teljesen funkcionális verzió (.exe fájl)

    Michael Brown elkötelezett technológiai rajongó, aki szenvedélyesen egyszerűsíti a bonyolult folyamatokat szoftvereszközök segítségével. A technológiai iparban szerzett több mint egy évtizedes tapasztalatával a Microsoft Excel és az Outlook, valamint a Google Táblázatok és a Dokumentumok területén fejlesztette tudását. Michael blogja célja, hogy megossza tudását és szakértelmét másokkal, könnyen követhető tippeket és oktatóanyagokat adva a termelékenység és a hatékonyság javításához. Akár tapasztalt szakember, akár kezdő, Michael blogja értékes betekintést és gyakorlati tanácsokat kínál, amelyek segítségével a legtöbbet hozhatja ki ezekből az alapvető szoftvereszközökből.