Excel Regex: одговара на низи со користење на регуларни изрази

  • Споделете Го Ова
Michael Brown

Во ова упатство, ќе разгледаме детално како да се користи регекс за усогласување низи во Excel.

Кога треба да пронајдете одредена вредност во опсегот од ќелиите, би ја користеле функцијата MATCH или XMATCH. Кога барате одредена низа во ќелија, функциите FIND и SEARCH ви се корисни. И како да знаете дали ќелијата содржи информации што се совпаѓаат со дадена шема? Очигледно, со користење на регуларни изрази. Но, надвор од кутијата Excel не поддржува регекси! Без грижи, ќе ја принудиме :)

    Excel VBA Regex функцијата да одговара на низите

    Како што е прилично јасно од насловот, со цел да се користат регуларни изрази во Excel, треба да креирате своја сопствена функција. За среќа, VBA на Excel има вграден објект RegExp , кој можете да го користите во вашиот код како што е прикажано подолу:

    Јавна функција RegExpMatch(влезен_опсег како опсег, шема како стринг, изборен match_case како булова = точно ) Како Variant Dim arRes() Како варијанта 'низа за складирање на резултатите Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols Долго 'индекс на тековниот ред во изворниот опсег, индекс на тековната колона во изворниот опсег, број на редови, број на колони На грешка GoTo ErrHandl RegExpMatch = arRes Постави regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = шема regex.Global = True regex.MultiLine = True If True = match_case Потоа regex.Игнореце regex = Falsex. Крајизрази.

    Шема : \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 или повеќе алфанумерички знаци.

    Со оригиналниот текст во А5 и шаблонот во А5, формулата ја добива оваа форма:

    =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 формула со match regex

    Поради фактот што вградените и сопственифункциите се одвиваат убаво, нема ништо што би ве спречило да ги користите заедно во една формула.

    За да вратите или пресметате нешто ако правилен израз се совпаѓа и нешто друго ако не е совпаднат, вметнете го приспособениот RegExpMatch функција во логичкиот текст на IF:

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

    На пример, ако низата во A5 содржи важечка адреса за е-пошта, можете да вратите „Да“; инаку „Не“.

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

    Сметајте ако регексот е совпаднат

    Бидејќи матичните функции на Excel не поддржуваат регуларни изрази, тоа е не е можно да се стави регекс директно во функцијата COUNTIS или COUNTIFS. За среќа, можете да ја емулирате оваа функционалност користејќи ја нашата приспособена функција.

    Да претпоставиме дека сте користеле регекс за усогласување телефонски броеви и за излез на резултатите во колоната Б. За да откриете колку ќелии содржат телефонски броеви, само треба да се избројат ВИСТИНСКИТЕ вредности во B5:B9. И тоа може лесно да се направи со користење на стандардната формула COUNTIF:

    =COUNTIF(B5:B9, TRUE)

    Не сакате дополнителни колони во вашиот работен лист? Нема проблем. Имајќи предвид дека нашата приспособена функција може да обработи повеќе ќелии истовремено и SUM на Excel може да собира вредности во низа, еве што правите:

    • Наведете референца за опсег до RegExpMatch, за да враќа низа од TRUE и FALSE вредности.
    • Користете двојна негација (--) за да ги присилите логичките вредности на оние инули.
    • Преземете ја функцијата SUM за да соберете 1 и 0 во добиената низа.

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

    Регекс совпаѓање со Ultimate Suite

    Корисниците на нашиот Ultimate Suite можат да користат четири моќни Regex функции без да додаваат никаков VBA код во нивните работни книги бидејќи тие се непречено интегрирани во Excel за време на инсталацијата на додатокот. Нашите сопствени функции се обработуваат од стандардниот .NET RegEx мотор и поддржуваат класични регуларни изрази со целосно карактеристики.

    Како да се користи приспособената функција RegexMatch

    Претпоставувајќи дека ја имате инсталирано најновата верзија на Ultimate Suite ( 2021.4 или подоцна), можете да креирате формула Regex Match во два едноставни чекори:

    1. На табулаторот Ablebits Data , во групата Text , кликнете Регекс алатки .

  • На окното Регекс алатки , направете го следново:
    • Изберете изворните низи.
    • Внесете го вашиот шаблон.
    • Изберете ја опцијата Match .
    • За да ги имате резултатите како формули, а не вредности, изберете го Внеси како формула штиклирајте го полето.
    • Кликнете на копчето Поклопи .

    Еден момент подоцна, функцијата AblebitsRegexMatch се вметнува во нова колона десно од вашите податоци.

    На сликата од екранот подолу, функцијата проверува дали низите во колоната А содржат 7-цифрени броеви или не.

    Совети:

    • Функцијата ција може да се внесе директно во ќелија преку стандардниот дијалог прозорец Вметни функција , каде што е категоризиран под AblebitsUDFs .
    • Стандардно, во формулата се додава редовен израз, но исто така можете да го задржите во посебна ќелија. За ова, само користете референца на ќелија за вториот аргумент.
    • Стандардно, функцијата е чувствителна на букви . За совпаѓање без чувствителност на букви, користете ја шемата (?i).

    За повеќе информации, погледнете ја функцијата AblebitsRegexMatch.

    Така се прави совпаѓање на регуларни изрази во Excel. Ви благодарам што прочитавте и со нетрпение очекувам да се видиме на нашиот блог следната недела!

    Достапни преземања

    Примери на Excel Regex Match (датотека .xlsm)

    Ultimate Suite 14- дневна целосно функционална верзија (датотека .exe)

    Ако cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputCols, 1 To cntInputCols) За iInputCurRow = 1 До cntInputRows За iInputCurlsRes. .Cells(iInputCurRow, iInputCurCol).Value) Следно Следно RegExpMatch = arRes Излезна функција ErrHandl: RegExpMatch = CVERr(xlErrValue) Крајна функција

    Залепете го кодот во уредникот VBA и вашата нова функција е RegMatch подготвени за употреба. Ако не сте многу искусни со VBA, ова упатство може да биде корисно: Како да вметнете VBA код во Excel.

    Забелешка. Откако ќе го вметнете кодот, не заборавајте да ја зачувате вашата датотека како работна книга со овозможена макро (.xlsm).

    RegExpMatch синтакса

    Функцијата RegExpMatch проверува дали некој дел од изворната низа се совпаѓа со регуларен израз. Резултатот е Булова вредност: ТОЧНО ако се најде барем едно совпаѓање, НЕТОЧНО во спротивно.

    Нашата приспособена функција има 3 аргументи - првите два се задолжителни, а последниот е изборен:

    RegExpMatch(текст , шема, [совпаѓање_случај])

    Каде:

    • Текст (задолжително) - една или повеќе низи за пребарување. Може да се достават како референца за ќелија или опсег.
    • Шама (задолжително) - регуларниот израз што треба да се совпадне. Кога се става директно во формула, шемата мора да биде затворена во двојни наводници.
    • Match_case (изборно) - ја дефинира совпаѓањетотип. Ако е ТОЧНО или испуштено (стандардно), се врши совпаѓање чувствително на големи букви; ако НЕТОЧНО - нема чувствителност на букви.

    Функцијата работи во сите верзии на Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 и Excel 2010.

    3 работи што треба да знае за RegExpMatch

    Пред да дојдеме до практични пресметки, ве молиме обрнете внимание на следните точки кои појаснуваат некои технички работи:

    1. Функцијата може да обработи единечна ќелија или опсег на ќелии . Во вториот случај, резултатите се враќаат во соседните ќелии во форма на динамична низа или опсег на истурање, како што е прикажано во овој пример.
    2. Стандардно, функцијата е чувствителна на букви . За да ги игнорирате буквите на текстот, поставете го аргументот match_case на FALSE. Поради ограничувањата на VBA Regexp, шаблонот (?i) кој не е чувствителен на големи букви не е поддржан.
    3. Ако не се најде валидна шема, функцијата враќа FALSE; ако шаблонот е невалиден , #VALUE! се појавува грешка.

    Подолу, ќе најдете неколку примери за совпаѓање со регекс што се создадени за демонстративни цели. Не можеме да гарантираме дека нашите обрасци ќе работат беспрекорно со поширок опсег на влезни податоци во вашите вистински работни листови. Пред да започнете со производство, задолжително тестирајте ги и приспособете ги нашите шаблони за примероци според вашите потреби.

    Како да користите regex за усогласување на низите во 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 означува збор граница, што значи SKU е посебен збор, а не дел од поголема низа како што е 23-MAR-2022.

    Со воспоставената шема, можеме да продолжиме со пишување формула. Во суштина, користењето прилагодена функција не се разликува од домашната. Штом почнете да пишувате формула, името на функцијата ќе се појави во списокот предложен од AutoComplete на Excel. Сепак, постојат неколку нијанси во динамичката низа 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 заедно.

    Regex за да се совпадне бројот

    За да одговарате на која било единечна цифра од 0 до 9, користете го знакот \d во регексот. Во зависност од вашата конкретна задача, додајте соодветен квантификатор или креирајте покомплексна шема.

    Регекс за да одговара на кој било број

    За да одговара на кој било број од која било должина, ставете го квантификаторот + веднаш по / знак d, кој вели да барате броеви што содржат 1 или повеќе цифри.

    Шема : \d+

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

    Регекс за да се совпадне бројот со одредена должина

    Ако вашата цел е да поклопите нумерички вредности што содржат одреден број цифри, тогаш користете \d заедно со соодветен квантификатор.

    На пример, за да се совпаднат броевите на фактурите што се состојат од точно 7 цифри, би користеле \d{7}. Сепак, имајте на ум дека ќе одговара на 7како што се очекуваше:

    Забелешки:

    • Меѓународните шифри не се проверуваат, па може или не се присутни.
    • Во редовните изрази, \s се залага за кој било знак на празно место, како што е празно место, јазиче, враќање на превозот или нова линија. За да дозволите само празни места, користете [-\. ] наместо [-\.\s].
    • Regex за да НЕ се совпаѓа со карактерот

      За да пронајдете низи што НЕ содржат одреден знак, можете да користите негирани класи на знаци [^ ] што се совпаѓаат било што НЕ во заграда. На пример:

      • [^13] ќе одговара на кој било знак што не е 1 или 3.
      • [^1-3] ќе одговара на секој поединечен знак што не е 1, 2 или 3 (т.е. која било цифра од 1 до 3).

      Во списокот со телефонски броеви, да претпоставиме дека сакате да ги најдете оние што немаат код на државата. Имајќи предвид дека секој меѓународен код го вклучува знакот +, можете да ја користите класата на знаци [^\+] за да најдете низи што не содржат знак плус. Важно е да се сфати дека горенаведениот израз се совпаѓа со секој знак што не е +. Бидејќи телефонскиот број може да биде каде било во низата, не мора на самиот почеток, квантификаторот * се додава за да се провери секој следен знак. Прицврстувачите за почеток ^ и крај $ гарантираат дека целата низа е обработена. Како резултат на тоа, го добиваме долунаведениот регуларен израз кој вели „не се совпаѓа со знакот + во ниту една позиција во низата“.

      Шема :^[^\+]*$

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

      Регекс за да НЕ одговара низа

      Иако не постои посебна синтакса на регуларен израз за не се совпаѓа со одредена низа, можете да го имитирате ова однесување со користење на негативен изглед.

      Да претпоставиме дека сакате да најдете низи што не го содржат зборот „лимони“. Овој редовен израз ќе биде добар:

      Шема : ^((?! лимони).)*$

      Очигледно, тука е потребно некое објаснување. Негативниот изглед (?! лимони) гледа надесно за да види дали нема збор „лимони“ напред. Ако „лимони“ го нема, тогаш точката се совпаѓа со кој било знак освен прекин на линијата. Горенаведениот израз врши само една проверка, а квантификаторот * го повторува нула или повеќе пати, од почетокот на низата закотвена со ^ до крајот на низата закотвена со $.

      За игнорирање на големината на текстот, го поставивме третиот аргумент на FALSE за да ја направиме нашата функција нечувствителна на големи букви:

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

      Совети и забелешки:

      • Горенаведениот регекс работи само за низи еднолиниски . Во случај на жици со милтилини, знаците ^ и $ се совпаѓаат со почетокот и крајот на секоја линија наместо со почетокот и крајот на влезната низа, затоа регексот бара само во првата линија.
      • За да се совпаднат низите што не започнуваат со одреден текст , користете регуларен израз како што е ^(?! лимони).*$
      • За да се совпаднат низите што не завршуваат со одреден текст , вклучетекрајната низа се закотвува во шаблонот за пребарување: ^((?!lemons$).)*$

      совпаѓање без чувствителност на букви

      Во класичните правилни изрази, постои посебна шема за совпаѓање без чувствителност на големи букви (?i), кое не е поддржано во VBA RegExp. За да се надмине ова ограничување, нашата приспособена функција го прифаќа третиот изборен аргумент со име совпаѓање_случај . За да направите совпаѓање без чувствителност на големи букви, едноставно поставете го на FALSE.

      Да речеме дека сакате да идентификувате датуми како 1-мар-22 или 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. Блогот на Мајкл е посветен на споделување на своето знаење и експертиза со другите, обезбедувајќи лесни за следење совети и упатства за подобрување на продуктивноста и ефикасноста. Без разлика дали сте искусен професионалец или почетник, блогот на Мајкл нуди вредни сознанија и практични совети за да го извлечете максимумот од овие основни софтверски алатки.