Excel Regex: супастаўляйце радкі з дапамогай рэгулярных выразаў

  • Падзяліцца Гэтым
Michael Brown

У гэтым уроку мы падрабязна разгледзім, як выкарыстоўваць рэгулярны выраз для супастаўлення радкоў у Excel.

Калі вам трэба знайсці пэўнае значэнне ў дыяпазоне ячэек, вы павінны выкарыстоўваць функцыю MATCH або XMATCH. Пры пошуку пэўнага радка ў ячэйцы карыснымі становяцца функцыі ПОШУК і ПОШУК. І як даведацца, ці змяшчае ячэйка інфармацыю, якая адпавядае зададзенаму шаблону? Відавочна, з дапамогай рэгулярных выразаў. Але з скрынкі Excel не падтрымлівае рэгулярныя выразы! Не турбуйцеся, мы прымусім гэта зрабіць :)

    Функцыя Excel VBA Regex для супадзення радкоў

    Як даволі ясна з загалоўка, каб выкарыстоўваць рэгулярныя выразы у Excel вам трэба стварыць уласную функцыю. На шчасце, VBA Excel мае ўбудаваны аб'ект RegExp , які вы можаце выкарыстоўваць у сваім кодзе, як паказана ніжэй:

    Public Function RegExpMatch(input_range As Range, pattern As String, Optional match_case As Boolean = True) As Variant Dim arRes() As Variant 'масіў для захавання вынікаў Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'індэкс бягучага радка ў зыходным дыяпазоне, індэкс бягучага слупка ў зыходным дыяпазоне, колькасць радкоў, колькасць слупкі On Error GoTo ErrHandl RegExpMatch = arRes Set regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = шаблон regex.Global = True regex.MultiLine = True If True = match_case Then regex.ignorecase = False Else regex.ignorecase = True Канецвыразы.

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

    Каб лепш зразумець, што тут адбываецца, давайце больш падрабязна разгледзім кожную частку :

    • Імя карыстальніка можа ўключаць літары, лічбы, падкрэсліванне, кропкі і злучкі. Памятаючы, што \w адпавядае любой літары, лічбе або падкрэсліванню, мы атрымаем наступны рэгулярны выраз: [\w\.\-]+
    • Імя дамена можа ўключаць у сябе вялікія і малыя літары, лічбы, злучок (але не ў першай або апошняй пазіцыі) і кропкі (у выпадку субдаменаў). Паколькі падкрэсліванне забаронена, замест \w мы выкарыстоўваем 3 розныя наборы сімвалаў: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
    • Дамен верхняга ўзроўню складаецца з кропкі, за якой ідуць вялікія і малыя літары. Ён можа змяшчаць ад 2 да 24 літар (самы доўгі TLD з існуючых): \.[A-Za-z]{2,24}

    Заўвага. Шаблон мяркуе, што даменнае імя змяшчае 2 або больш літарна-лічбавых сімвалаў.

    З арыгінальным тэкстам у фармаце A5 і шаблонам у фармаце A5 формула прымае такую ​​форму:

    =RegExpMatch(A5, $A$2)

    Або вы можаце выкарыстаць больш просты звычайны выраз для праверкі электроннай пошты з наборам сімвалаў у ніжнім або ў верхнім рэгістры:

    Шаблон : \b[\w\.\-]+@[a-z0-9]+[a- z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b

    Але зрабіце вашу формулу неадчувальнай да рэгістра:

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

    Формула Excel IF з адпаведным рэгулярным выразам

    З-за таго, што ўбудаваныя і карыстальніцкіяфункцыі добра спалучаюцца, няма нічога, што перашкаджала б выкарыстоўваць іх разам у адной формуле.

    Каб вярнуць або вылічыць нешта, калі рэгулярны выраз супадае, і нешта яшчэ, калі яно не супадае, убудуйце карыстальніцкі RegExpMatch функцыя ў лагічным тэксце IF:

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

    Напрыклад, калі радок у A5 змяшчае сапраўдны адрас электроннай пошты, вы можаце вярнуць «Так»; інакш "Не".

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

    Палічыць, калі рэгулярны выраз супадае

    Паколькі ўласныя функцыі Excel не падтрымліваюць рэгулярныя выразы, гэта немагчыма змясціць рэгулярны выраз непасрэдна ў функцыі COUNTIS або COUNTIFS. На шчасце, вы можаце эмуляваць гэту функцыянальнасць з дапамогай нашай карыстальніцкай функцыі.

    Выкажам здагадку, што вы выкарысталі рэгулярны выраз для супастаўлення тэлефонных нумароў і вываду вынікаў у слупок B. Каб даведацца, колькі вочак змяшчае тэлефонныя нумары, вам проста трэба для падліку ПРАЎДНЫХ значэнняў у B5:B9. І гэта можна лёгка зрабіць, выкарыстоўваючы стандартную формулу COUNTIF:

    =COUNTIF(B5:B9, TRUE)

    Не жадаеце лішніх слупкоў у вашым аркушы? Няма праблем. Маючы на ​​ўвазе, што наша карыстальніцкая функцыя можа апрацоўваць некалькі ячэек адначасова, а Excel SUM можа складаць значэнні ў масіве, вось што вы робіце:

    • Падайце спасылку на дыяпазон у RegExpMatch, каб ён вяртаў масіў значэнняў TRUE і FALSE.
    • Выкарыстоўвайце падвойнае адмаўленне (--), каб прывесці лагічныя значэнні да адзінак інулі.
    • Атрымайце функцыю SUM, каб скласці 1 і 0 у атрыманым масіве.

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

    Супадзенне рэгулярных выразаў з Ultimate Suite

    Карыстальнікі нашага Ultimate Suite могуць выкарыстоўваць чатыры магутныя функцыі рэгулярных выразаў без дадання кода VBA ў свае працоўныя кнігі, так як яны плаўна інтэгруюцца ў Excel падчас усталявання надбудовы. Нашы карыстальніцкія функцыі апрацоўваюцца стандартным механізмам .NET RegEx і падтрымліваюць поўнафункцыянальныя класічныя рэгулярныя выразы.

    Як выкарыстоўваць карыстальніцкую функцыю RegexMatch

    Пры ўмове, што ў вас усталявана апошняя версія Ultimate Suite ( 2021.4 або больш позняй версіі), вы можаце стварыць формулу супадзення рэгулярных выразаў у два простыя крокі:

    1. На ўкладцы Ablebits Data у групе Тэкст націсніце Інструменты рэгулярных выразаў .

  • На панэлі Інструменты рэгулярных выразаў зрабіце наступнае:
  • Праз імгненне функцыя AblebitsRegexMatch устаўляецца ў новы слупок справа ад вашых даных.

    На скрыншоце ніжэй функцыя правярае, ці ўтрымліваюць радкі ў слупку A 7-значны код. лічбы ці не.

    Парады:

    • Функцыя цыя можа быць устаўлена непасрэдна ў ячэйку праз стандартнае дыялогавае акно Уставіць функцыю , дзе яно класіфікуецца як AblebitsUDFs .
    • Па змаўчанні ў формулу дадаецца рэгулярны выраз, але вы таксама можаце захаваць яго ў асобную клетку. Для гэтага проста выкарыстоўвайце спасылку на ячэйку для 2-га аргумента.
    • Па змаўчанні функцыя адчувальная да рэгістра . Для супастаўлення без уліку рэгістра выкарыстоўвайце шаблон (?i).

    Для атрымання дадатковай інфармацыі, калі ласка, глядзіце функцыю AblebitsRegexMatch.

    Вось як зрабіць супастаўленне рэгулярных выразаў у Excel. Я дзякую вам за чытанне і з нецярпеннем чакаю сустрэчы з вамі ў нашым блогу на наступным тыдні!

    Даступныя спампоўкі

    Прыклады супастаўлення рэгулярных выразаў Excel (файл .xlsm)

    Ultimate Suite 14- дзённая поўнафункцыянальная версія (файл .exe)

    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 iInputCurCol = 1 To cntInputCols arRes(iInputCurRow, iInputCurCol) =(regex_range.Test .Cells(iInputCurRow, iInputCurCol).Value) Далей Далей RegExpMatch = arRes Функцыя выхаду ErrHandl: RegExpMatch = CVErr(xlErrValue) End Function

    Устаўце код у рэдактар ​​VBA, і ваша новая функцыя RegExpMatch будзе гатовы да выкарыстання. Калі вы не маеце вялікага вопыту працы з VBA, гэта кіраўніцтва можа быць карысным: Як уставіць код VBA ў Excel.

    Заўвага. Пасля ўстаўкі кода не забудзьце захаваць свой файл як рабочую кнігу з падтрымкай макрасаў (.xlsm).

    Сінтаксіс RegExpMatch

    Функцыя RegExpMatch правярае, ці адпавядае якая-небудзь частка зыходнага радка рэгулярнаму выразу. У выніку атрымліваецца лагічнае значэнне: TRUE, калі знойдзена хаця б адно супадзенне, FALSE у адваротным выпадку.

    Наша карыстальніцкая функцыя мае 3 аргументы - першыя два абавязковыя, а апошні неабавязковы:

    RegExpMatch(text , узор, [рэгістр_супадзення])

    Дзе:

    • Тэкст (абавязкова) - адзін або некалькі радкоў для пошуку. Можна падаць як спасылку на ячэйку або дыяпазон.
    • Шаблон (абавязкова) - рэгулярны выраз для супастаўлення. Пры размяшчэнні непасрэдна ў формуле шаблон павінен быць заключаны ў двукоссе.
    • Match_case (неабавязкова) - вызначае супадзеннетыпу. Калі TRUE або апушчана (па змаўчанні), супастаўленне выконваецца з улікам рэгістра; калі FALSE - неадчувальны да рэгістра.

    Функцыя працуе ва ўсіх версіях Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 і Excel 2010.

    3 рэчы, якія вы варта ведаць пра RegExpMatch

    Перш чым мы пяройдзем да практычных вылічэнняў, звярніце ўвагу на наступныя моманты, якія праясняюць некаторыя тэхнічныя моманты:

    1. Функцыя можа апрацоўваць адзіночную ячэйку або дыяпазон ячэек . У апошнім выпадку вынікі вяртаюцца ў суседніх ячэйках у выглядзе дынамічнага масіва або дыяпазону разліву, як паказана ў гэтым прыкладзе.
    2. Па змаўчанні функцыя адчувальная да рэгістра . Каб ігнараваць рэгістр тэксту, усталюйце для аргумента match_case значэнне FALSE. З-за абмежаванняў VBA Regexp шаблон без уліку рэгістра (?i) не падтрымліваецца.
    3. Калі сапраўдны шаблон не знойдзены, функцыя вяртае FALSE; калі шаблон несапраўдны , #ЗНАЧЭННЕ! адбываецца памылка.

    Ніжэй вы знойдзеце некалькі прыкладаў адпаведнасці рэгулярных выразаў, якія былі створаны ў дэманстрацыйных мэтах. Мы не можам гарантаваць, што нашы шаблоны будуць бездакорна працаваць з больш шырокім дыяпазонам уваходных даных у вашых рэальных лістах. Перш чым запускаць вытворчасць, не забудзьцеся пратэставаць і наладзіць нашы шаблоны ўзораў у адпаведнасці з вашымі патрэбамі.

    Як выкарыстоўваць рэгулярныя выразы для супастаўлення радкоў у Excel

    Калі ўсе радкі, якія вы хочаце супаставіць, маюць той жа ўзор,рэгулярныя выразы з'яўляюцца ідэальным рашэннем.

    Выкажам здагадку, што ў вас ёсць дыяпазон ячэек (A5:A9), якія змяшчаюць розныя звесткі пра некаторыя элементы. Вы хочаце ведаць, якія ячэйкі маюць SKU. Мяркуючы, што кожны SKU складаецца з 2 вялікіх літар, злучка і 3 лічбаў, вы можаце супаставіць іх з дапамогай наступнага выразу.

    Шаблон : \b[A-Z]{2}-\ d{3}\b

    Дзе [A-Z]{2} азначае любыя 2 вялікія літары ад A да Z, а \d{3} азначае любыя 3 лічбы ад 0 да 9. Сімвал \b абазначае слова boundary, што азначае, што SKU з'яўляецца асобным словам, а не часткай большага радка, напрыклад, 23-MAR-2022.

    Калі ўзор усталяваны, мы можам перайсці да напісання формулы. Па сутнасці, выкарыстанне карыстальніцкай функцыі нічым не адрозніваецца ад уласнай. Як толькі вы пачнеце ўводзіць формулу, назва функцыі з'явіцца ў спісе, прапанаваным аўтазапаўненнем Excel. Аднак у Dynamic Array Excel (Microsoft 365 і Excel 2021) і традыцыйным Excel (2019 і больш раннія версіі) ёсць некалькі нюансаў.

    Спаставіць радок у адной ячэйцы

    Спаставіць радок у адной ячэйцы спасылайцеся на гэтую ячэйку ў першым аргументе. Другі аргумент павінен утрымліваць рэгулярны выраз.

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

    Шаблон таксама можа захоўвацца ў прадвызначанай ячэйцы, якая заблакіравана абсалютнай спасылкай ($A$2):

    =RegExpMatch(A5, $A$2)

    Пасля ўводу формулы ў першую ячэйку вы можаце перацягнуць яе ва ўсе астатнія радкі.

    Гэты метадвыдатна працуе ва ўсіх версіях Excel .

    Спаставіць радкі ў некалькіх ячэйках адначасова

    Каб супаставіць некалькі радкоў з адной формулай, уключыце спасылку на дыяпазон у першы аргумент:

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

    У Excel 365 і Excel 2021 , якія падтрымліваюць дынамічныя масівы, гэта працуе наступным чынам - вы ўводзіце формулу ў першую ячэйку, націскаеце Enter, і формула аўтаматычна пераходзіць у наступныя ячэйкі.

    У Excel 2019 і больш ранніх версіях гэта працуе толькі як традыцыйная формула масіва CSE, якая ўводзіцца ў дыяпазон вочак і завяршаецца адначасовым націсканнем клавіш Ctrl + Shift + Enter.

    Рэгулярны выраз, які адпавядае нумару

    Каб знайсці адну лічбу ад 0 да 9, выкарыстоўвайце сімвал \d у рэгулярным выразе. У залежнасці ад вашай канкрэтнай задачы, дадайце адпаведны квантыфікатар або стварыце больш складаны ўзор.

    Рэгулярны выраз для адпаведнасці любому ліку

    Каб супаставіць любы лік любой даўжыні, пастаўце + квантыфікатар адразу пасля / сімвал d, які кажа, што трэба шукаць лікі, якія змяшчаюць 1 ці больш лічбаў.

    Шаблон : \d+

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

    Рэгулярны выраз для адпавядання колькасці пэўнай даўжыні

    Калі ваша мэта - адпавядаць лікавым значэнням, якія змяшчаюць пэўную колькасць лічбаў, выкарыстоўвайце \d разам з адпаведным квантарам.

    Напрыклад, каб супаставіць нумары рахункаў-фактур, якія складаюцца роўна з 7 лічбаў, вы павінны выкарыстоўваць \d{7}. Аднак майце на ўвазе, што ён будзе адпавядаць 7як і чакалася:

    Заўвагі:

    • Міжнародныя коды не правяраюцца, таму яны могуць прысутнічаць, а могуць і не быць.
    • У рэгулярных выразах \s азначае любы прабел, напрыклад прабел, табуляцыю, вяртанне карэткі або новы радок. Каб дазволіць толькі прабелы, выкарыстоўвайце [-\. ] замест [-\.\s].
    • Рэгулярны выраз, які НЕ супадае з сімвалам

      Каб знайсці радкі, якія НЕ ўтрымліваюць пэўны сімвал, вы можаце выкарыстоўваць адмоўленыя класы сімвалаў [^ ], якія супадаюць што-небудзь НЕ ў дужках. Напрыклад:

      • [^13] будзе адпавядаць любому асобнаму сімвалу, які не з'яўляецца 1 або 3.
      • [^1-3] будзе адпавядаць любому асобнаму сімвалу, які не з'яўляецца 1, 2 ці 3 (г.зн. любая лічба ад 1 да 3).

      У спісе тэлефонных нумароў, выкажам здагадку, вы хочаце знайсці тыя, якія не маюць кода краіны. Памятаючы, што любы міжнародны код утрымлівае знак +, вы можаце выкарыстоўваць клас сімвалаў [^\+], каб знайсці радкі, якія не ўтрымліваюць знака плюс. Важна разумець, што прыведзены вышэй выраз адпавядае любому асобнаму сімвалу, які не з'яўляецца +. Паколькі нумар тэлефона можа знаходзіцца дзе заўгодна ў радку, неабавязкова ў самым пачатку, для праверкі кожнага наступнага сімвала дадаецца квантыфікатар *. Якары пачатку ^ і канца $ гарантуюць апрацоўку ўсяго радка. У выніку мы атрымліваем прыведзены ніжэй рэгулярны выраз, які абвяшчае «не супадаць з сімвалам + ні ў адной пазіцыі ў радку».

      Шаблон :^[^\+]*$

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

      Рэгулярны выраз НЕ адпавядае радку

      Хаця не існуе спецыяльнага сінтаксісу рэгулярных выразаў для не адпавядае пэўнаму радку, вы можаце эмуляваць гэтыя паводзіны, выкарыстоўваючы адмоўны прагляд.

      Выкажам здагадку, што вы хочаце знайсці радкі, якія не ўтрымліваюць слова "lemons". Гэты рэгулярны выраз будзе добра працаваць:

      Шаблон : ^((?!лімоны).)*$

      Відавочна, што тут патрэбны некаторыя тлумачэнні. Адмоўны погляд наперад (?!лімоны) глядзіць направа, каб убачыць, ці няма наперадзе слова "лімоны". Калі «лімонаў» няма, то кропка адпавядае любому сімвалу, акрамя разрыву радка. Прыведзены вышэй выраз выконвае толькі адну праверку, а квантар * паўтарае яе нуль або больш разоў, ад пачатку радка, прывязанага ^, да канца радка, прывязанага $.

      Каб ігнараваць рэгістр тэксту, мы ўсталёўваем 3-му аргументу значэнне FALSE, каб наша функцыя не адчувала да рэгістра:

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

      Парады і заўвагі:

      • Прыведзены вышэй рэгулярны выраз працуе толькі для аднарадковых радкоў. У выпадку шматрадковых радкоў сімвалы ^ і $ супадаюць з пачаткам і канцом кожнага радка, а не з пачаткам і канцом радка ўводу, таму рэгулярны выраз шукае толькі ў першым радку.
      • Каб супаставіць радкі, якія не пачынаюцца з пэўнага тэксту , выкарыстоўвайце рэгулярны выраз, напрыклад ^(?!lemons).*$
      • Каб супаставіць радкі, якія не заканчваюцца пэўным тэкстам , уключыцеканчатковы радок прымацоўваецца да шаблону пошуку: ^((?!lemons$).)*$

      Супадзенне без уліку рэгістра

      У класічных рэгулярных выразах існуе спецыяльны шаблон для супадзенне без уліку рэгістра (?i), якое не падтрымліваецца ў VBA RegExp. Каб пераадолець гэтае абмежаванне, наша карыстальніцкая функцыя прымае трэці неабавязковы аргумент пад назвай match_case . Каб выканаць супадзенне без уліку рэгістра, проста ўсталюйце для яго значэнне FALSE.

      Дапусцім, вы хочаце вызначыць такія даты, як 1 сакавіка 2022 года або 01 сакавіка 2022 года. Каб супаставіць фарматы дд-ммм-гггг і д-ммм-ггг , мы выкарыстоўваем наступны рэгулярны выраз.

      Шаблон : \b\d{1,2}-(студзеньлічбаў у любым месцы радка, уключаючы 10-значны або 100-значны лік. Калі гэта не тое, што вы шукаеце, пастаўце мяжу слова \b з абодвух бакоў.

      Шаблон : \b\d{7}\b

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

      Рэгулярны выраз для супастаўлення тэлефонных нумароў

      Паколькі тэлефонныя нумары могуць быць запісаны ў розных фарматах, іх супастаўленне патрабуе больш складанага рэгулярнага выразу.

      У прыведзеным ніжэй наборы даных мы будзем шукаць 10-значныя лікі, якія маюць 3 лічбы ў першых 2 групах і 4 лічбы ў апошняй групе. Групы можна падзяляць кропкай, злучком або прабелам. Першая група можа быць заключана ў дужкі, а можа і не.

      Шаблон: (\(\d{3}\)

    Майкл Браўн - адданы энтузіяст тэхналогій, які любіць спрашчэнне складаных працэсаў з дапамогай праграмных інструментаў. Маючы больш чым дзесяцігадовы досвед працы ў індустрыі тэхналогій, ён удасканальваў свае навыкі ў Microsoft Excel і Outlook, а таксама ў Google Sheets і Docs. Блог Майкла прысвечаны таму, каб падзяліцца сваімі ведамі і вопытам з іншымі, даючы простыя ў выкананні парады і падручнікі для павышэння прадукцыйнасці і эфектыўнасці. Незалежна ад таго, з'яўляецеся вы дасведчаным прафесіяналам або пачаткоўцам, блог Майкла прапануе каштоўную інфармацыю і практычныя парады, каб атрымаць максімальную аддачу ад гэтых неабходных праграмных інструментаў.