Excel Regex: tumugma sa mga string gamit ang mga regular na expression

  • Ibahagi Ito
Michael Brown

Sa tutorial na ito, magkakaroon tayo ng malalim na pagtingin sa kung paano gamitin ang regex upang tumugma sa mga string sa Excel.

Kapag kailangan mong maghanap ng partikular na halaga sa isang hanay ng mga cell, gagamitin mo ang MATCH o XMATCH function. Kapag naghahanap ng isang partikular na string sa isang cell, ang FIND at SEARCH function ay madaling gamitin. At paano mo malalaman kung ang isang cell ay naglalaman ng impormasyon na tumutugma sa isang ibinigay na pattern? Malinaw, sa pamamagitan ng paggamit ng mga regular na expression. Ngunit sa labas ng kahon Excel ay hindi sumusuporta sa mga regex! Huwag mag-alala, pipilitin namin itong gawin :)

    Excel VBA Regex function upang tumugma sa mga string

    Dahil ito ay medyo malinaw mula sa heading, upang gumamit ng mga regular na expression sa Excel, kailangan mong lumikha ng iyong sariling function. Sa kabutihang palad, ang VBA ng Excel ay may inbuilt na RegExp object, na magagamit mo sa iyong code tulad ng ipinapakita sa ibaba:

    Public Function RegExpMatch(input_range As Range, pattern As String , Opsyonal match_case As Boolean = True ) As Variant Dim arRes() Bilang Variant 'array upang mag-imbak ng mga resulta Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols Bilang Long 'index ng kasalukuyang row sa source range, index ng kasalukuyang column sa source range, bilang ng mga row, bilang ng columns 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 Tapusinmga expression.

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

    Para mas maunawaan kung ano ang nangyayari dito, tingnan natin ang bawat bahagi :

    • Username ay maaaring magsama ng mga titik, numero, underscore, tuldok at gitling. Tandaan na ang \w ay tumutugma sa anumang titik, digit o underscore, nakukuha namin ang sumusunod na regex: [\w\.\-]+
    • Pangalan ng domain ay maaaring magsama ng malalaking titik at maliliit na titik, digit, gitling (ngunit hindi sa una o huling posisyon) at tuldok (sa kaso ng mga subdomain). Dahil hindi pinapayagan ang mga underscore, sa halip na \w gumagamit kami ng 3 magkakaibang set ng character: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
    • Nangungunang antas na domain ay binubuo ng isang tuldok na sinusundan ng malalaking titik at maliliit na titik. Maaari itong maglaman ng mula 2 hanggang 24 na titik (ang pinakamahabang TLD na kasalukuyang umiiral): \.[A-Za-z]{2,24}

    Tandaan. Ipinapalagay ng pattern na ang domain name ay naglalaman ng 2 o higit pang mga alphanumeric na character.

    Gamit ang orihinal na text sa A5 at ang pattern sa A5, ganito ang hugis ng formula:

    =RegExpMatch(A5, $A$2)

    O maaari kang gumamit ng mas simpleng regular expression para sa pagpapatunay ng email na may lowercase o uppercase na set ng character:

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

    Ngunit gawing case-insensitive ang iyong formula:

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

    Excel IF formula na may tugmang regex

    Dahil sa inbuilt at custom nagumagana nang maayos ang mga function, walang makakapigil sa iyong gamitin ang mga ito nang magkasama sa isang formula.

    Upang ibalik o kalkulahin ang isang bagay kung ang isang regular na expression ay tumugma at iba pa kung hindi ito tumugma, i-embed ang custom na RegExpMatch function sa lohikal na teksto ng IF:

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

    Halimbawa, kung ang isang string sa A5 ay naglalaman ng wastong email address, maaari mong ibalik ang "Oo"; kung hindi, "Hindi".

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

    Bilangin kung tumugma ang regex

    Dahil hindi sinusuportahan ng mga native na function ng Excel ang mga regular na expression, ito ay hindi posibleng maglagay ng regex nang direkta sa COUNTIS o COUNTIFS function. Sa kabutihang-palad, maaari mong tularan ang functionality na ito gamit ang aming custom na function.

    Ipagpalagay na gumamit ka ng regex upang tumugma sa mga numero ng telepono at maglabas ng mga resulta sa column B. Upang malaman kung ilang cell ang naglalaman ng mga numero ng telepono, kailangan mo lang para mabilang ang TRUE value sa B5:B9. At iyon ay madaling gawin gamit ang karaniwang COUNTIF formula:

    =COUNTIF(B5:B9, TRUE)

    Ayaw mo ba ng anumang karagdagang column sa iyong worksheet? Walang problema. Tandaan na ang aming custom na function ay maaaring magproseso ng maramihang mga cell sa isang pagkakataon at ang Excel's SUM ay maaaring magdagdag ng mga halaga sa isang array, narito ang gagawin mo:

    • Magbigay ng range reference sa RegExpMatch, kaya ito ay nagbabalik ng array ng TRUE at FALSE value.
    • Gumamit ng double negation (--) para pilitin ang mga logical value sa isa atmga zero.
    • Kunin ang SUM function upang magdagdag ng 1 at 0 sa resultang array.

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

    Pagtutugma ng regex na may Ultimate Suite

    Maaaring magamit ng mga user ng aming Ultimate Suite ang apat na makapangyarihang mga function ng Regex nang hindi nagdaragdag ng anumang VBA code sa kanilang mga workbook habang ang mga ito ay maayos na isinama sa Excel sa panahon ng pag-install ng add-in. Ang aming mga custom na function ay pinoproseso ng karaniwang .NET RegEx engine at sumusuporta sa mga full-feature na classic na regular expression.

    Paano gamitin ang custom na RegexMatch function

    Ipagpalagay na mayroon kang pinakabagong bersyon ng Ultimate Suite na naka-install ( 2021.4 o mas bago), maaari kang lumikha ng formula ng Regex Match sa dalawang simpleng hakbang:

    1. Sa tab na Ablebits Data , sa grupong Text , i-click Regex Tools .

  • Sa pane ng Regex Tools , gawin ang sumusunod:
    • Piliin ang source strings.
    • Ilagay ang iyong pattern.
    • Piliin ang opsyon na Itugma .
    • Upang magkaroon ng mga resulta bilang mga formula, hindi mga value, piliin ang Ipasok bilang formula check box.
    • I-click ang button na Itugma .

    Pagkaraan ng ilang sandali, ang AblebitsRegexMatch function ay ipinasok sa isang bagong column sa kanan ng iyong data.

    Sa screenshot sa ibaba, sinusuri ng function kung ang mga string sa column A ay naglalaman ng 7-digit numero o hindi.

    Mga Tip:

    • Ang func Ang tion ay maaaring ipasok direkta sa isang cell sa pamamagitan ng karaniwang Insert Function dialog box, kung saan ito ay ikinategorya sa ilalim ng AblebitsUDFs .
    • Bilang default, isang regular na expression ang idinaragdag sa formula, ngunit maaari mo ring panatilihin ito sa isang hiwalay na selda. Para dito, gumamit lang ng cell reference para sa 2nd argument.
    • Bilang default, ang function ay case-sensitive . Para sa case-insensitive na pagtutugma, gamitin ang (?i) pattern.

    Para sa higit pang impormasyon, pakitingnan ang AblebitsRegexMatch function.

    Ganyan ang paggawa ng regular na pagtutugma ng expression sa Excel. Salamat sa pagbabasa at umaasa akong makita ka sa aming blog sa susunod na linggo!

    Mga available na download

    Mga halimbawa ng Excel Regex Match (.xlsm file)

    Ultimate Suite 14- araw na ganap na gumaganang bersyon (.exe file)

    Kung cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputRows, 1 To cntInputCols) Para sa iInputCurRow = 1 To cntInputRows Para sa iInputCurCol = 1 To cntRow(iColsInputRows) .Cells(iInputCurRow, iInputCurCol).Value) Susunod na Susunod na RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) End Function

    I-paste ang code sa VBA editor, at ang iyong bagong RegExpMatch function ay maaari nang gamitin. Kung hindi ka gaanong karanasan sa VBA, maaaring makatulong ang gabay na ito: Paano magpasok ng VBA code sa Excel.

    Tandaan. Pagkatapos ipasok ang code, tandaan na i-save ang iyong file bilang isang macro-enabled workbook (.xlsm).

    RegExpMatch syntax

    Ang RegExpMatch function ay nagsusuri kung ang anumang bahagi ng source string ay tumutugma sa isang regular na expression. Ang resulta ay Boolean value: TRUE kung may makitang kahit isang tugma, FALSE kung hindi.

    May 3 argumento ang aming custom na function - kailangan ang unang dalawa at opsyonal ang huli:

    RegExpMatch(text , pattern, [match_case])

    Saan:

    • Text (kinakailangan) - isa o higit pang mga string na hahanapin. Maaaring ibigay bilang cell o range reference.
    • Pattern (kinakailangan) - ang regular na expression upang tumugma. Kapag direktang inilagay sa isang formula, ang isang pattern ay dapat na nakapaloob sa double quotes.
    • Match_case (opsyonal) - tumutukoy sa tugmauri. Kung TAMA o inalis (default), isasagawa ang case-sensitive na pagtutugma; kung FALSE - case-insensitive.

    Gumagana ang function sa lahat ng bersyon ng Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 at Excel 2010.

    3 bagay sa iyo dapat malaman ang tungkol sa RegExpMatch

    Bago tayo makarating sa mga praktikal na kalkulasyon, mangyaring bigyang-pansin ang mga sumusunod na punto na nagpapaliwanag ng ilang teknikalidad:

    1. Ang function ay maaaring magproseso ng isang isang cell o saklaw ng mga cell . Sa huling kaso, ibinabalik ang mga resulta sa mga kalapit na cell sa anyo ng isang dynamic na array, o spill range, tulad ng ipinapakita sa halimbawang ito.
    2. Bilang default, ang function ay case-sensitive . Upang balewalain ang text case, itakda ang match_case argument sa FALSE. Dahil sa mga limitasyon ng VBA Regexp, hindi sinusuportahan ang case-insensitive na pattern (?i).
    3. Kung ang isang wastong pattern ay hindi natagpuan, ang function ay nagbabalik ng FALSE; kung ang pattern ay hindi wasto , isang #VALUE! nagkakaroon ng error.

    Sa ibaba, makakakita ka ng ilang mga halimbawa ng regex match na ginawa para sa mga layunin ng pagpapakita. Hindi namin magagarantiya na ang aming mga pattern ay gagana nang walang kamali-mali sa isang mas malawak na hanay ng input data sa iyong mga tunay na worksheet. Bago isagawa ang produksyon, tiyaking subukan at isaayos ang aming mga pattern ng sample ayon sa iyong mga pangangailangan.

    Paano gamitin ang regex upang tumugma sa mga string sa Excel

    Kapag ang lahat ng mga string na gusto mong itugma ay mayroong parehong pattern,ang mga regular na expression ay isang mainam na solusyon.

    Ipagpalagay na mayroon kang isang hanay ng mga cell (A5:A9) na naglalaman ng iba't ibang mga detalye tungkol sa ilang mga item. Gusto mong malaman kung aling mga cell ang may mga SKU. Ipagpalagay na ang bawat SKU ay binubuo ng 2 malalaking titik, isang gitling, at 3 digit, maaari mong itugma ang mga ito gamit ang sumusunod na expression.

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

    Kung saan ang [A-Z]{2} ay nangangahulugang anumang 2 malalaking titik mula A hanggang Z at ang \d{3} ay nangangahulugang anumang 3 digit mula 0 hanggang 9. Ang \b character ay tumutukoy sa isang salita hangganan, ibig sabihin, ang isang SKU ay isang hiwalay na salita, at hindi bahagi ng isang mas malaking string gaya ng 23-MAR-2022.

    Sa nabuong pattern, maaari tayong magpatuloy sa pagsusulat ng formula. Mahalaga, ang paggamit ng custom na function ay hindi naiiba sa isang native. Sa sandaling magsimula kang mag-type ng formula, lalabas ang pangalan ng function sa listahang iminungkahi ng AutoComplete ng Excel. Gayunpaman, mayroong ilang mga nuances sa Dynamic Array Excel (Microsoft 365 at Excel 2021) at tradisyonal na Excel (2019 at mas lumang mga bersyon).

    Itugma ang string sa isang cell

    Upang tumugma sa isang string sa isang cell, sumangguni sa cell na iyon sa unang argumento. Ang pangalawang argumento ay dapat na naglalaman ng isang regular na expression.

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

    Ang pattern ay maaari ding panatilihin sa isang paunang natukoy na cell, na naka-lock na may ganap na reference ($A$2):

    =RegExpMatch(A5, $A$2)

    Pagkatapos ilagay ang formula sa unang cell, maaari mo itong i-drag pababa sa lahat ng iba pang row.

    Ang paraang itogumagana nang maganda sa lahat ng bersyon ng Excel .

    Itugma ang mga string sa maramihang mga cell nang sabay-sabay

    Upang tumugma sa maraming string sa isang formula, magsama ng reference ng range sa unang argument:

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

    Sa Excel 365 at Excel 2021 na sumusuporta sa mga dynamic na array, ito ay gumagana sa ganitong paraan - i-type mo ang formula sa unang cell, pindutin ang Enter , at ang formula ay awtomatikong lalabas sa ibabang mga cell.

    Sa Excel 2019 at mas maaga, ito gumagana lang bilang tradisyonal na CSE array formula, na ipinasok sa hanay ng mga cell at kinukumpleto sa pamamagitan ng pagpindot sa Ctrl + Shift + Enter key nang magkasama.

    Regex to match number

    Upang tumugma sa anumang solong digit mula 0 hanggang 9, gamitin ang \d na character sa regex. Depende sa iyong partikular na gawain, magdagdag ng angkop na quantifier o gumawa ng mas kumplikadong pattern.

    Regex upang tumugma sa anumang numero

    Upang tumugma sa anumang numero ng anumang haba, ilagay ang + quantifier pagkatapos ng / d character, na nagsasabing maghanap ng mga numerong naglalaman ng 1 o higit pang mga digit.

    Pattern : \d+

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

    Regex upang tumugma sa bilang ng partikular na haba

    Kung ang iyong layunin ay upang tumugma sa mga numeric na halaga na naglalaman ng isang tiyak na bilang ng mga digit, pagkatapos ay gamitin ang \d kasama ng isang naaangkop na quantifier.

    Halimbawa, upang tumugma sa mga numero ng invoice na binubuo ng eksaktong 7 digit, gagamitin mo ang \d{7}. Gayunpaman, pakitandaan na tutugma ito sa 7tulad ng inaasahan:

    Mga Tala:

    • Ang mga internasyonal na code ay hindi nasuri, kaya maaaring naroroon o wala ang mga ito.
    • Sa mga regular na expression, ang \s ay kumakatawan sa anumang whitespace na character tulad ng isang espasyo, tab, carriage return, o bagong linya. Upang payagan ang mga puwang lamang, gamitin ang [-\. ] sa halip na [-\.\s].
    • Regex to NOT tumugma sa character

      Upang maghanap ng mga string na HINDI naglalaman ng isang partikular na character, maaari mong gamitin ang mga negated na klase ng character [^ ] na tumutugma anumang HINDI sa mga bracket. Halimbawa:

      • [^13] ay tutugma sa anumang solong character na hindi 1 o 3.
      • [^1-3] ay tutugma sa anumang solong character na hindi 1, 2 o 3 (ibig sabihin, anumang digit mula 1 hanggang 3).

      Sa isang listahan ng mga numero ng telepono, ipagpalagay na gusto mong hanapin ang mga walang country code. Tandaan na ang anumang internasyonal na code ay may kasamang + sign, maaari mong gamitin ang [^\+] character class para maghanap ng mga string na walang plus sign. Mahalagang matanto na ang expression sa itaas ay tumutugma sa anumang solong character na hindi +. Dahil ang isang numero ng telepono ay maaaring nasa kahit saan sa isang string, hindi kinakailangan sa pinakasimula, ang * quantifier ay idinaragdag upang suriin ang bawat kasunod na character. Tinitiyak ng start ^ at end $ anchors na ang buong string ay naproseso. Bilang resulta, nakukuha namin ang regular na expression sa ibaba na nagsasabing "huwag tumugma sa + character sa anumang posisyon sa string".

      Pattern :^[^\+]*$

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

      Regex para HINDI tumugma sa string

      Kahit na walang espesyal na regular na expression syntax para sa hindi tumutugma sa isang partikular na string, maaari mong tularan ang gawi na ito sa pamamagitan ng paggamit ng negatibong pagtingin.

      Ipagpalagay na gusto mong makahanap ng mga string na hindi naglalaman ng ng salitang "lemon". Ang regular na expression na ito ay gagana ng isang treat:

      Pattern : ^((?!lemon).)*$

      Malinaw, kailangan ng ilang paliwanag dito. Ang negatibong lookahead (?!lemon) ay tumitingin sa kanan upang makita kung walang salitang "lemon" sa unahan. Kung wala ang "lemon", ang tuldok ay tumutugma sa anumang karakter maliban sa isang line break. Ang expression sa itaas ay nagsasagawa lamang ng isang pagsusuri, at ang * quantifier ay inuulit ito ng zero o higit pang beses, mula sa simula ng string na naka-angkla ng ^ hanggang sa dulo ng string na naka-angkla ng $.

      Upang huwag pansinin ang text case, itinakda namin ang 3th argument sa FALSE para gawing case-insensitive ang aming function:

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

      Mga tip at tala:

      • Gumagana lang ang regex sa itaas para sa single-line na mga string. Sa kaso ng milti-line string, ang ^ at $ na mga character ay tumutugma sa simula at dulo ng bawat linya sa halip na sa simula at dulo ng input string, samakatuwid ang regex ay naghahanap lamang sa unang linya.
      • Upang tumugma sa mga string na hindi nagsisimula sa ilang partikular na text , gumamit ng regular na expression gaya ng ^(?!lemon).*$
      • Upang itugma ang mga string na hindi nagtatapos sa ilang partikular na text , isamaang end string anchor sa pattern ng paghahanap: ^((?!lemons$).)*$

      Case insensitive na pagtutugma

      Sa mga classic na regular na expression, mayroong isang espesyal na pattern para sa case-insensitive na pagtutugma (?i), na hindi sinusuportahan sa VBA RegExp. Upang malampasan ang limitasyong ito, tinatanggap ng aming custom na function ang ika-3 opsyonal na argumento na pinangalanang match_case . Para gumawa ng case-insensitive na pagtutugma, itakda lang ito sa FALSE.

      Sabihin nating gusto mong tukuyin ang mga petsa gaya ng 1-Mar-22 o 01-MAR-2022. Upang tumugma sa mga format na dd-mmm-yyyy at d-mmm-yyy , ginagamit namin ang sumusunod na regular na expression.

      Pattern : \b\d{1,2}-(Enemga digit saanman sa string kasama ang isang 10-digit o 100-digit na numero. Kung hindi ito ang iyong hinahanap, ilagay ang salitang hangganan \b sa magkabilang panig.

      Pattern : \b\d{7}\b

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

      Regex upang tumugma sa mga numero ng telepono

      Dahil ang mga numero ng telepono ay maaaring isulat sa iba't ibang mga format, ang pagtutugma sa mga ito ay nangangailangan ng mas sopistikadong regular na expression.

      Sa ibabang dataset, maghahanap kami ng 10-digit na numero na mayroong 3 digit sa unang 2 pangkat at 4 na digit sa huling pangkat. Ang mga pangkat ay maaaring paghiwalayin ng isang tuldok, gitling o espasyo. Ang unang pangkat ay maaari o maaaring hindi nakapaloob sa mga panaklong.

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

    Si Michael Brown ay isang dedikadong mahilig sa teknolohiya na may hilig sa pagpapasimple ng mga kumplikadong proseso gamit ang mga tool sa software. Sa higit sa isang dekada ng karanasan sa industriya ng tech, hinasa niya ang kanyang mga kasanayan sa Microsoft Excel at Outlook, pati na rin ang Google Sheets at Docs. Ang blog ni Michael ay nakatuon sa pagbabahagi ng kanyang kaalaman at kadalubhasaan sa iba, na nagbibigay ng madaling sundan na mga tip at mga tutorial para sa pagpapabuti ng pagiging produktibo at kahusayan. Isa ka mang batikang propesyonal o baguhan, nag-aalok ang blog ni Michael ng mahahalagang insight at praktikal na payo para masulit ang mahahalagang software tool na ito.