Excel Regex: съвпадение на низове с помощта на регулярни изрази

  • Споделя Това
Michael Brown

В този урок ще разгледаме подробно как да използваме regex за съпоставяне на низове в Excel.

Когато трябва да откриете определена стойност в диапазон от клетки, ще използвате функцията MATCH или XMATCH. Когато търсите конкретен низ в клетка, функциите FIND и SEARCH са ви полезни. А как да разберете дали дадена клетка съдържа информация, която отговаря на даден модел? Очевидно с помощта на регулярни изрази. Но в готов вид 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 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

    Поставете кода в редактора на VBA и новата ви RegExpMatch Ако нямате голям опит с VBA, това ръководство може да ви бъде от полза: Как да вмъкнете код VBA в Excel.

    Забележка: След като вмъкнете кода, не забравяйте да запазите файла си като работна книга с активирани макроси (.xlsm).

    Синтаксис на RegExpMatch

    Сайтът RegExpMatch Функцията проверява дали някоя част от изходния низ съответства на регулярен израз. Резултатът е булева стойност: TRUE, ако е намерено поне едно съответствие, FALSE в противен случай.

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

    RegExpMatch(текст, шаблон, [match_case])

    Къде:

    • Текст (задължително) - един или повече низове, в които да се търси. Може да се предостави като препратка към клетка или диапазон.
    • Модел (задължително) - регулярен израз за съответствие. Когато е поставен директно във формула, шаблонът трябва да бъде заграден в двойни кавички.
    • Match_case (незадължително) - определя типа на съвпадение. Ако е TRUE или е пропуснато (по подразбиране), се извършва съвпадение с отчитане на големи и малки букви; ако е FALSE - без отчитане на големи и малки букви.

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

    3 неща, които трябва да знаете за RegExpMatch

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

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

    По-долу ще намерите няколко примера за regex съвпадения, които са създадени с демонстрационна цел. Не можем да гарантираме, че нашите модели ще работят безпроблемно с по-широк набор от входни данни в реалните ви работни листове. Преди да ги пуснете в производство, не забравяйте да тествате и коригирате нашите примерни модели според нуждите си.

    Как да използвате 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.

    След като моделът е установен, можем да преминем към писане на формула. По същество използването на потребителска функция не се различава от използването на нативна функция. Веднага щом започнете да въвеждате формула, името на функцията ще се появи в списъка, предложен от функцията за автоматично довършване на 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 цифри навсякъде в низа, включително 10-цифрено или 100-цифрено число. Ако не търсите това, поставете граничната дума \b от двете страни.

    Модел : \b\d{7}\b

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

    Regex за съвпадение на телефонни номера

    Тъй като телефонните номера могат да се записват в различни формати, тяхното сравняване изисква по-сложен регулярен израз.

    В посочената по-долу съвкупност от данни ще търсим 10-цифрени числа, които имат 3 цифри в първите 2 групи и 4 цифри в последната група. Групите могат да бъдат разделени с точка, тире или интервал. Първата група може да бъде или да не бъде затворена в скоби.

    Модел: (\(\d{3}\)

    След като разбием този регулярен израз, получаваме следното:

    • Първата част (\(\d{3}\)
    • Частта [-\.\s]? означава 0 или 1 поява на който и да е символ в квадратни скоби: дефис, точка или бял интервал.
    • След това има още една група от 3 цифри d{3}, последвана от тире, точка или бял интервал [\-\.\s]?, които се появяват 0 или 1 път.
    • Последната група от 4 цифри \d{4} е последвана от гранична дума \b, за да се разбере, че телефонният номер не може да бъде част от по-голям номер.

    С оригиналния низ в A5 и регулярния израз в A2 формулата придобива следния вид:

    =RegExpMatch(A5, $A$2)

    ... и работи точно както се очаква:

    Бележки:

    • Международните кодове не се проверяват, така че може да присъстват, но може и да не присъстват.
    • В регулярните изрази \s означава всеки бял символ, като например интервал, табулация, връщане на карета или нов ред. За да разрешите само интервали, използвайте [-\. ] вместо [-\.\s].
    • Регекс за НЕсъвпадение на символ

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

      • [^13] ще съвпадне с всеки отделен символ, който не е 1 или 3.
      • [^1-3] ще съответства на всеки отделен символ, който не е 1, 2 или 3 (т.е. всяка цифра от 1 до 3).

      Предполагаме, че в списък с телефонни номера искате да намерите тези, които нямат код на страната. Като имате предвид, че всеки международен код включва знака +, можете да използвате класа символи [^\+], за да намерите низове, които не съдържат знак плюс. Важно е да се разбере, че горният израз отговаря на всеки отделен символ, който не е +. Тъй като телефонен номер може да бъде навсякъде в низа, а ненепременно в самото начало се добавя квантификаторът *, за да се проверява всеки следващ символ. Началните ^ и крайните $ котви гарантират, че се обработва целият низ. В резултат на това получаваме долния регулярен израз, който гласи "не съчетавай символа + на нито една позиция в низа".

      Модел : ^[^\+]*$

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

      Регекс за НЕсъвпадение на низ

      Въпреки че не съществува специален синтаксис на регулярен израз за несъответствие с определен низ, можете да имитирате това поведение, като използвате отрицателна стойност.

      Да предположим, че искате да намерите низове, които не съдържат думата "лимони". Този регулярен израз ще работи отлично:

      Модел : ^(((?!лимони).)*$

      Очевидно тук са необходими някои обяснения. Отрицателният поглед (?!лимони) гледа надясно, за да провери дали пред него няма дума "лимони". Ако "лимони" няма там, тогава точката съвпада с всеки символ, освен с прекъсване на реда. Горният израз извършва само една проверка, а квантификаторът * я повтаря нула или повече пъти, от началото на низа, закотвен с ^, до края на низа, закотвен с$.

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

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

      Съвети и бележки:

      • Горният регекс работи само за едноредов В случай на низове от няколко реда символите ^ и $ съвпадат с началото и края на всеки ред вместо с началото и края на входния низ, поради което регексът търси само в първия ред.
      • Съвпадение с низове, които не стартирайте с определен текст , използвайте регулярен израз, например ^(?!лимони).*$
      • Съвпадение с низове, които не приключват с определен текст , включете крайния символен низ в модела за търсене: ^((?!лимони$).)*$

      Съвпадение без отчитане на големи и малки букви

      В класическите регулярни изрази има специален шаблон за съвпадение без разлика на големи и малки букви (?i), който не се поддържа във VBA RegExp. За да се преодолее това ограничение, нашата потребителска функция приема третия незадължителен аргумент, наречен match_case . За да направите съвпадение без значение на размера на буквите, просто задайте FALSE.

      Да речем, че искате да идентифицирате дати като 1 март 22 г. или 01 март 2022 г. За да съответствате на dd-mmm-yyyy и d-mmm-yy формати, използваме следния регулярен израз.

      Модел : \b\d{1,2}-(Jan

      Нашият израз търси група от 1 или 2 цифри, последвани от тире, последвани от някое от съкращенията на месеца, разделени от

      Защо не използвате по-прост модел, например \d{1,2}-[A-Za-z]{3}-\d{2,4}\b? За да предотвратите фалшиви положителни съвпадения като 01-ABC-2020.

      Въведете модела в A2 и ще получите следната формула:

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

      Регекс за съвпадение на валидни имейл адреси

      Както е известно, имейл адресът се състои от 4 части: потребителско име, символ @, име на домейн (пощенски сървър) и домейн от първо ниво (като .com, .edu, .org и т.н.). За да проверим валидността на имейл адреса, ще трябва да възпроизведем горната структура с помощта на регулярни изрази.

      Модел : \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)

      Формула IF на Excel с мач regex

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

      За да върнете или изчислите нещо, ако даден регулярен израз съвпада, и нещо друго, ако не съвпада, вградете потребителската функция RegExpMatch в логическия текст на IF:

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

      Например, ако низът в A5 съдържа валиден имейл адрес, можете да върнете "Да"; в противен случай "Не".

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

      Бройте, ако речникът е изпълнен

      Тъй като родните функции на Excel не поддържат регулярни изрази, не е възможно да въведете regex директно във функцията COUNTIS или COUNTIFS. За щастие можете да имитирате тази функционалност, като използвате нашата потребителска функция.

      Да предположим, че сте използвали регекс за съпоставяне на телефонни номера и сте извели резултатите в колона B. За да разберете колко клетки съдържат телефонни номера, трябва просто да преброите стойностите TRUE в 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 в раздела Текст група, щракнете върху Инструменти за регекс .

    • На Инструменти за регекс направете следното:
      • Изберете изходните низове.
      • Въведете модела си.
      • Изберете Мач опция.
      • За да получите резултатите като формули, а не като стойности, изберете Вмъкване като формула квадратчето за отметка.
      • Щракнете върху Мач бутон.

      Миг по-късно AblebitsRegexMatch се вмъква в нова колона вдясно от данните.

      На скрийншота по-долу функцията проверява дали низовете в колона А съдържат 7-цифрени числа или не.

      Съвети:

      • Функцията може да бъде вмъкнат директно в клетка чрез стандартния Функция за вмъкване диалоговия прозорец, където е категоризиран под AblebitsUDFs .
      • По подразбиране към формулата се добавя регулярен израз, но можете да го запазите и в отделна клетка. За тази цел просто използвайте препратка към клетка за втория аргумент.
      • По подразбиране функцията е отчитане на малки и големи букви . За съвпадение без значение на големи и малки букви използвайте шаблона (?i).

      За повече информация, моля, вижте функцията AblebitsRegexMatch.

      Това е начинът за извършване на съвпадение на регулярни изрази в Excel. Благодаря ви, че прочетохте, и с нетърпение очаквам да ви видя в нашия блог следващата седмица!

      Налични изтегляния

      Примери за регекс съвпадения в Excel (.xlsm файл)

      Ultimate Suite 14-дневна напълно функционална версия (.exe файл)

    Майкъл Браун е отдаден технологичен ентусиаст със страст към опростяване на сложни процеси с помощта на софтуерни инструменти. С повече от десетилетие опит в технологичната индустрия, той е усъвършенствал уменията си в Microsoft Excel и Outlook, както и в Google Sheets и Docs. Блогът на Майкъл е посветен на споделянето на неговите знания и опит с други, предоставяйки лесни за следване съвети и уроци за подобряване на продуктивността и ефективността. Независимо дали сте опитен професионалист или начинаещ, блогът на Michael предлага ценни прозрения и практически съвети за извличане на максимума от тези основни софтуерни инструменти.