Regex за извлекување низи во Excel (едно или сите совпаѓања)

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

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

Microsoft Excel обезбедува голем број функции за извлекување текст од клетките. Тие функции можат да се справат со повеќето предизвици за извлекување низа во вашите работни листови. Повеќето, но не сите. Кога функциите Текст се сопнуваат, редовните изрази доаѓаат да спасат. Чекај... Excel нема RegEx функции! Точно, нема вградени функции. Но, нема ништо што би ве спречило да ги користите вашите сопствени :)

    Excel VBA Regex функција за извлекување низи

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

    Јавна функција RegExpExtract(текст како низа, шема како стринг, изборен пример_број како цел број = 0, изборен match_case како булова = точно) Затемнето text_matches() Како низа Dim matches_index Како цел број на грешка GoTo ErrHandl RegExpExtract = "" Постави regex = CreateObject ( "VBScript.RegExp") regex.pattern = шаблон regex.Global = Вистински regex.MultiLine = Вистински regex. ignorecase = Неточно Друго regex.ignorecase = Вистински крај Ако се совпаѓа = regex.Изврши(текст) Ако 0 < се совпаѓа. Брои Потоа Ако (0 = пример_број) Потоа ReDim text_matches( matches.Count - 1, 0) За matches_index = 0 ToVBA RegExp, ве охрабрувам да го прочитате следниот дел кој зборува за многу помоќни .NET Regex функции.

    Прилагодена .NET базирана Regex функција за извлекување текст во Excel

    За разлика од функциите VBA RegExp кои може да биде напишано од кој било корисник на Excel, .NET RegEx е областа на програмерите. Microsoft .NET Framework поддржува целосно опремена синтакса на редовни изрази компатибилна со Perl 5. Оваа статија нема да ве научи како да пишувате такви функции (јас не сум програмер и немам ни најмала идеја како да го направам тоа :)

    Четири моќни функции обработени од стандардниот .NET RegEx мотор се веќе напишани од нашите развивачи и вклучени во Ultimate Suite. Подолу, ќе покажеме неколку практични употреби на функцијата специјално дизајнирана за извлекување текст во Excel.

    Совет. За информации за синтаксата .NET Regex, погледнете во .NET Regular Expression Language.

    Како да извлечете убоди во Excel користејќи редовни изрази

    Претпоставувајќи дека ја имате инсталирано најновата верзија на Ultimate Suite, извлекувањето текст со користење на регуларни изрази се сведува на овие два чекори:

    1. На картичката Ablebits Data , во групата Text , кликнете Regex Tools .
    2. На окното Regex Tools , изберете ги изворните податоци, внесете ја вашата шема на Regex и изберете ја опцијата Extract . За да го добиете резултатот како приспособена функција, а не како вредност, изберете ја проверката Внеси како формула кутија. Кога ќе завршите, кликнете на копчето Extract .

    Резултатите ќе се појават во нова колона десно од вашите оригинални податоци:

    Синтакса на AblebitsRegexExtract

    Нашата приспособена функција ја има следнава синтакса:

    AblebitsRegexExtract(референца, регуларен_израз)

    Каде:

    • Референца (задолжително) - упатување на ќелијата што ја содржи изворната низа.
    • Regular_expression (задолжително) - регекс шемата да се совпадне.

    Важна забелешка! Функцијата работи само на машините со инсталиран Ultimate Suite за Excel.

    Забелешки за користење

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

    1. За да креирате формула, можете да ги користите нашите Регекс алатки или дијалогот Вметни функција на Excel или да го напишете целото име на функцијата во ќелија. Откако ќе се вметне формулата, можете да управувате со неа (уредување, копирање или преместување) како и која било домашна формула.
    2. Шемата што ја внесувате во окното Regex Tools оди во вториот аргумент. Исто така, можно е да се задржи правилен израз во посебна ќелија. Во овој случај, само користете референца на ќелија за вториот аргумент.
    3. Функцијата го извлекува прво пронајденото совпаѓање .
    4. Стандардно, функцијата е случај -чувствителен . За совпаѓање без чувствителност на букви, користете ја шемата (?i).
    5. Ако не се најде совпаѓање, грешката #N/A есе вратија.

    Регекс за извлекување низа помеѓу два знака

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

    Ајде да земеме текст меѓу два знака. кажете дека сакате да извлечете текст меѓу загради. Групата за сликање е најлесниот начин.

    Шема 1 : \[(.*?)\]

    Со позитивен поглед зад себе и поглед напред, резултатот ќе биде точно истото.

    Шема 2 : (?<=\[)(.*?)(?=\])

    Ве молиме обрнете внимание дека нашата група за фаќање (.*?) врши мрзливо пребарување за текст помеѓу две загради - од првата [ до првата ]. Група за сликање без прашалник (.*) би направила алкомо пребарување и би снимила сè од првиот [ до последниот ].

    Со шемата во А2, формулата оди како следува:

    =AblebitsRegexExtract(A5, $A$2)

    Како да ги добиете сите совпаѓања

    Како што веќе беше споменато, функцијата AblebitsRegexExtract може да извлече само едно совпаѓање. За да ги добиете сите совпаѓања, можете да ја користите функцијата VBA за која разговаравме претходно. Сепак, постои едно предупредување - VBA RegExp не поддржува снимање групи, така што горната шема ќе ги врати и знаците „гранични“, загради во нашиот случај.

    =TEXTJOIN(" ", TRUE, RegExpExtract(A5, $A$2))

    За да се ослободиме од заградите, ЗАМЕНИ ги со празни низи ("") користејќи ја оваа формула:

    =SUBSTITUTE(SUBSTITUTE(TEXTJOIN(", ", TRUE, RegExpExtract(A5, $A$2)), "]", ""),"[","")

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

    Регекс за извлекување текст помеѓу две низи

    Пристапот што го работевметолкувајте го буквално).

  • (?:[A-Za-z\d\-\.]{2,255}\.)? - група што не зафаќа за идентификување на домени од трето, четврто ниво, итн., доколку ги има ( мобилни во нашиот примерок URL). Во првата шема, тој е сместен во поголема група за снимање за да се вклучат сите такви поддомени во екстракцијата. Поддоменот може да биде долг од 2 до 255 знаци, па оттука и квантификаторот {2.255}.
  • ([A-Za-z\d\-]{1,63}\.[A-Za-z] {2,24}) - фаќање група за извлекување на доменот од второ ниво ( ablebits ) и доменот од највисоко ниво ( com ). Максималната должина на домен од второ ниво е 63 знаци. Најдолгиот домен на највисоко ниво што моментално постои содржи 24 знаци.
  • Во зависност од тоа кој регуларен израз е внесен во A2, формулата подолу ќе произведе различни резултати:

    =AblebitsRegexExtract(A5, $A$2)

    Regex за да се извлече целосното име на домен со сите поддомени:

    Regex за да се извлече домен од второ ниво домен без поддомени:

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

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

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

    Пробна верзија на Ultimate Suite (.exe датотека)

    \b(0?[0-9]matches.Count - 1 text_matches( matches_index, 0) = matches.Item( matches_index) Next matches_index RegExpExtract = text_ matches Друго RegExpExtract = совпаѓа.

    Ако имате мало искуство со VBA, чекор-по-чекор корисничко упатство може да се покаже корисно: Како да вметнете VBA код во Excel.

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

    RegExpExtract синтакса

    Функцијата RegExpExtract бара влезна низа за вредности што одговараат на регуларен израз и извлекува едно или сите совпаѓања.

    Функцијата ја има следнава синтакса :

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

    Каде:

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

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

    4 работи што треба да ги знаете за RegExpExtract

    За ефикасно користење на функцијата во вашиот Excel, има неколку важни работи на кои треба да обрнете внимание:

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

    Пред да започнете да ја користите оваа приспособена функција во вашите работни листови, треба да разберете за што е способна, нели? Примерите подолу опфаќаат неколку случаи на вообичаена употреба и објаснуваат зошто однесувањето може да се разликува во динамична низа Excel (Microsoft 365 и Excel 2021) и традиционалниот Excel (2019 и постари верзии).

    Забелешка. Надворешните регекс примери се напишани за прилично едноставни збирки на податоци. Не можеме да гарантираме дека тие ќе работат беспрекорно во вашите вистински работни листови. Оние кои имаат искуство со регекс би се согласиле дека пишувањето редовни изрази е бескраен пат до совршенство - скоро секогаш постои начин да се направипоелегантен или способен за ракување со поширок опсег на влезни податоци.

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

    Следејќи ја основната максима на наставата „од едноставно до сложено“, ќе започнеме со многу едноставен случај: извлекување број од низа.

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

    Извадете го првиот број

    Ова е едноставно како што може да се добие regex. Имајќи предвид дека \d значи која било цифра од 0 до 9, а + значи едно или повеќе пати, нашиот регуларен израз ја има оваа форма:

    Шема : \d+

    Постави instance_num до 1 и ќе го добиете посакуваниот резултат:

    =RegExpExtract(A5, "\d+", 1)

    Каде што A5 е оригиналната низа.

    За погодност, можете да внесете шаблонот во однапред дефинирана ќелија ($A$2 ) и заклучете ја нејзината адреса со знакот $:

    =RegExpExtract(A5, $A$2, 1)

    Добијте го последниот број

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

    Шема : (\d+)(?!.*\d)

    Преведено на човечки јазик , вели: најдете број што не го следи (никаде, не само веднаш) кој било друг број. За да го изразиме ова, користиме негативен поглед пред (?!.*\d), што значи дека десно од шаблонот не треба да има друга цифра (\d) без разлика колку други знаци има пред неа.

    =RegExpExtract(A5, "(\d+)(?!.*\d)")

    Совети:

    • За да добиете специфична појава , користете \d+ за шаблон и соодветна серијаброј за instance_num .
    • Формулата за извлекување сите броеви се дискутира во следниот пример.

    Regex за да се извлечат сите совпаѓања

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

    Како што можеби се сеќавате, бројот на извлечени совпаѓања е контролиран од изборниот instance_num аргумент. Стандардно е сите совпаѓања, така што едноставно го испуштате овој параметар:

    =RegExpExtract(A2, "\d+")

    Формулата работи прекрасно за една клетка, но однесувањето се разликува во динамичката низа Excel и нединамичните верзии.

    Excel 365 и Excel 2021

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

    Excel 2019 и понизок

    Во преддинамичниот Excel, горната формула ќе врати само едно совпаѓање. За да добиете повеќе совпаѓања, треба да ја направите формула за низа. За ова, изберете опсег на ќелии, напишете ја формулата и притиснете Ctrl + Shift + Enter за да ја завршите.

    Недостаток на овој пристап е куп #N/A грешки што се појавуваат во „дополнителни ќелии“ . За жал, ништо не може да се направи околу тоа (ниту IFERROR, ниту IFNA не можат да го поправат, за жал).

    Извлечете ги сите совпаѓања во една ќелија

    При обработката на колона со податоци, горенаведениот пристап очигледно нема да работи. Во овој случај, идеално решениеќе ги врати сите натпревари во една ќелија. За да го направите тоа, сервирајте ги резултатите од RegExpExtract во функцијата TEXTJOIN и разделете ги со кој било разграниувач што го сакате, кажете запирка и празно место:

    =TEXTJOIN(", ", TRUE, RegExpExtract(A5, "\d+"))

    Забелешка. Бидејќи функцијата TEXTJOIN е достапна само во Excel за Microsoft 365, Excel 2021 и Excel 2019, формулата нема да работи во постарите верзии.

    Regex за извлекување текст од низата

    Извлекување текст од алфанумеричката низа е доста предизвикувачка задача во Excel. Со регекс, станува лесно како пита. Само користете негирана класа за да одговарате на сè што не е цифра.

    Шема : [^\d]+

    За да добиете поднизи во поединечни ќелии (опсег на истурање) , формулата е:

    =RegExpExtract(A5, "[^\d]+")

    За да ги внесете сите совпаѓања во една ќелија, вметнете ја функцијата RegExpExtract во TEXTJOIN вака:

    =TEXTJOIN("", TRUE, RegExpExtract(A5, "[^\d]+"))

    Regex во извлечете адреса на е-пошта од низата

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

    Шама : [\w\.\-]+@[A-Za-z0-9\.\-]+\.[A-Za-z]{2,24}

    Разградување на овој регекс , еве што добиваме:

    • [\w\.\-]+ е корисничко име што може да вклучува 1 или повеќе алфанумерички знаци, долни црти, точки и цртички.
    • @ симбол
    • [A-Za-z0-9\.\-]+ е име на домен што се состои од: големи и мали букви, цифри, цртички и точки (во случајна поддомени). Овде не се дозволени долни црти, затоа се користат 3 различни групи на знаци (како A-Z a-z и 0-9) наместо \w што одговара на која било буква, цифра или долна црта.
    • \.[A-Za-z ]{2,24} е домен од највисоко ниво. Се состои од точка проследена со големи и мали букви. Повеќето домени на највисоко ниво се долги со 3 букви (на пр. com .org, .edu итн.), но во теорија може да содржи од 2 до 24 букви (најдолгиот регистриран TLD).

    Претпоставувајќи дека низата е во А5 и шаблонот во А2, формулата за извлекување адреса на е-пошта е:

    =RegExpExtract(A5, $A$2)

    Regex за да се извлече доменот од е-пошта

    Кога доаѓа до извлекување на доменот на е-пошта, првата мисла што ми паѓа на ум е користење на група за снимање за да се најде текст што веднаш го следи знакот @.

    Шема : @([A-Za-z0 -9\.\-]+\.[A-Za-z]{2,24})

    Послужете го на нашата функција RegExp:

    =RegExpExtract(A5, "@([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})")

    И ќе го добиете овој резултат:

    Со класичните правилни изрази, сè што е надвор од групата за сликање не е вклучено во екстракцијата. Никој не знае зошто VBA RegEx работи поинаку и го снима и „@“. За да се ослободите од него, можете да го отстраните првиот знак од резултатот така што ќе го замените со празна низа.

    =REPLACE(RegExpExtract(A5, "@([a-z\d][a-z\d\-\.]*\.[a-z]{2,})", 1, FALSE), 1, 1, "")

    Обичен израз за извлекување телефонски броеви

    Телефонски броеви може да се напише на многу различни начини, поради што е речиси невозможно да се дојде до решение кое функционира под сите(\d{4}од низа

    Регуларен израз за извлекување датум зависи од форматот во кој датумот се појавува во низата. На пример:

    За да се извлечат датуми како 1/1/21 или 01/01/2021, регексот е: \d{1,2}\/\d{1,2}\/(\d {4}околности. Сепак, можете да ги запишете сите формати што се користат во вашата база на податоци и да се обидете да ги совпаднете.

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

    (123) 345-6789

    (123) 345 6789

    (123)3456789

    123- 345-6789

    123.345.6789

    123 345 6789

    1233456789

    Шема : \(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b

    • Првиот дел \(?\d{3} одговара на нула или една почетна заграда проследена со три цифри d{3}.
    • Делот [-\. \)]* значи кој било знак во квадратни загради што се појавуваат 0 или повеќе пати: цртичка, точка, празно место или заграда.
    • Следно, повторно имаме три цифри d{3} проследено со која било цртичка, точка или празно место [-\. ]? се појавува 0 или 1 пат.
    • Потоа, постои група од четири цифри \d{4}.
    • Конечно, постои граница на зборот \b што дефинира дека телефонски број сме барањето не може да биде дел од поголем број.

    Целосната формула го добива овој облик:

    =RegExpExtract(A5, "\(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b")

    Внимавајте дека горенаведениот регекс може да врати неколку лажно-позитивни резултати како што се 123) 456 7899 или (123 456 7899. Подолу верзијата ги решава овие проблеми. Сепак, оваа синтакса работи само во функциите VBA RegExp, а не во класичните регуларни изрази.

    Шема : (\(\d{3}\)out за извлекување текст помеѓу два знака ќе работи и за извлекување текст помеѓу две низи.

    На пример, за да добиете сè помеѓу „тест 1“ и „тест 2“, користете го следниов редовен израз.

    Шема : тест 1(.*?)тест 2

    Комплетната формула е:

    =AblebitsRegexExtract(A5, "test 1(.*?)test 2")

    Regex за да се извлече доменот од URL-то

    Дури и со редовни изрази, извлекувањето имиња на домени од URL-адреси не е тривијална задача. Клучниот елемент што го прави трикот е нефаќање групи. Во зависност од вашата крајна цел, изберете еден од долунаведените регекси.

    За да добиете целосно име на домен вклучувајќи поддомени

    Шема : (?: https?\:

    Мајкл Браун е посветен технолошки ентузијаст со страст за поедноставување на сложените процеси користејќи софтверски алатки. Со повеќе од една деценија искуство во технолошката индустрија, тој ги усоврши своите вештини во Microsoft Excel и Outlook, како и Google Sheets и Docs. Блогот на Мајкл е посветен на споделување на своето знаење и експертиза со другите, обезбедувајќи лесни за следење совети и упатства за подобрување на продуктивноста и ефикасноста. Без разлика дали сте искусен професионалец или почетник, блогот на Мајкл нуди вредни сознанија и практични совети за да го извлечете максимумот од овие основни софтверски алатки.