Рэгулярны выраз для здабывання радкоў у Excel (адзін або ўсе супадзенні)

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

Змест

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

Microsoft Excel забяспечвае шэраг функцый для вымання тэксту з клетак. Гэтыя функцыі могуць справіцца з большасцю задач па выманні радкоў у вашых лістах. Большасць, але не ўсе. Калі тэкставыя функцыі спатыкаюцца, на дапамогу прыходзяць рэгулярныя выразы. Пачакайце... Excel не мае функцый RegEx! Праўда, ніякіх убудаваных функцый. Але няма нічога, што перашкодзіла б вам выкарыстоўваць свае ўласныя :)

    Функцыя Excel VBA Regex для здабывання радкоў

    Каб дадаць карыстальніцкую функцыю Regex Extract у ваш Excel, устаўце наступны код у рэдактар ​​VBA. Каб уключыць рэгулярныя выразы ў VBA, мы выкарыстоўваем убудаваны аб'ект Microsoft RegExp.

    Публічная функцыя RegExpExtract(text As String, pattern As String, Optional instance_num As Integer = 0, Optional match_case As Boolean = True) Dim text_matches() As String Dim matches_index As Integer On Error GoTo ErrHandl RegExpExtract = "" 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 Set matches = regex.Execute(text) If 0 < matches.Count Then If (0 = instance_num) Then ReDim text_matches(matches.Count - 1, 0) For matches_index = 0 КабVBA RegExp, я заклікаю вас прачытаць наступную частку, у якой абмяркоўваюцца нашмат больш магутныя функцыі .NET Regex.

    Карыстальніцкая функцыя Regex на аснове .NET для здабывання тэксту ў 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. На панэлі Інструменты рэгулярных выразаў выберыце зыходныя дадзеныя, увядзіце шаблон рэгулярных выразаў і абярыце опцыю Выняць . Каб атрымаць вынік як карыстальніцкую функцыю, а не значэнне, усталюйце галачку Уставіць як формулу .скрынка. Пасля завяршэння націсніце кнопку Выняць .

    Вынікі з'явяцца ў новым слупку справа ад зыходных дадзеных:

    Сінтаксіс AblebitsRegexExtract

    Наша карыстальніцкая функцыя мае наступны сінтаксіс:

    AblebitsRegexExtract(спасылка, рэгулярны_выраз)

    Дзе:

    • Спасылка (абавязкова) - спасылка на ячэйку, якая змяшчае зыходны радок.
    • Рэгулярны_выраз (абавязкова) - шаблон рэгулярнага выразу для супадзення.

    Важная заўвага! Функцыя працуе толькі на машынах, на якіх усталяваны Ultimate Suite for Excel.

    Заўвагі па выкарыстанні

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

    1. Каб стварыць формулу, вы можаце выкарыстоўваць нашы Інструменты рэгулярных выразаў або дыялогавае акно Excel Уставіць функцыю або ўвесці поўнае імя функцыі ў ячэйцы. Пасля таго, як формула ўстаўлена, вы можаце кіраваць ёю (рэдагаваць, капіяваць або перамяшчаць), як любой роднай формулай.
    2. Шаблон, які вы ўводзіце на панэлі Інструменты рэгулярных выразаў , пераходзіць да 2-га аргумента. Таксама можна захаваць рэгулярны выраз у асобнай ячэйцы. У гэтым выпадку проста выкарыстоўвайце спасылку на ячэйку для 2-га аргумента.
    3. Функцыя вылучае першае знойдзенае супадзенне .
    4. Па змаўчанні функцыя мае рэгістр -адчувальны . Для супастаўлення без уліку рэгістра выкарыстоўвайце шаблон (?i).
    5. Калі супадзенне не знойдзена, выдаецца памылка #N/Aвяртаецца.

    Рэгулярны выраз для вылучэння радка паміж двума сімваламі

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

    Давайце скажыце, што вы хочаце атрымаць тэкст у дужках. Група захопу - самы просты спосаб.

    Шаблон 1 : \[(.*?)\]

    З пазітыўным поглядам ззаду і наперад вынік будзе дакладным тое самае.

    Узор 2 : (?<=\[)(.*?)(?=\])

    Звярніце ўвагу, што наша група захопу (.*?) выконвае лянівы пошук тэксту паміж двума дужкамі - ад першай [ да першай ]. Група захопу без пытальніка (.*) выканала б прагны пошук і захапіла б усё, ад першага [ да апошняга].

    З узорам у A2 формула выглядае як наступным чынам:

    =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 сімвалаў, таму квантар {2255}.
  • ([A-Za-z\d\-]{1,63}\.[A-Za-z] {2,24}) - група захопу для здабывання дамена другога ўзроўню ( ablebits ) і дамена верхняга ўзроўню ( com ). Максімальная даўжыня дамена другога ўзроўню складае 63 сімвала. Самы доўгі існуючы дамен верхняга ўзроўню змяшчае 24 сімвалы.
  • У залежнасці ад таго, які рэгулярны выраз уведзены ў A2, наступная формула дасць розныя вынікі:

    =AblebitsRegexExtract(A5, $A$2)

    Рэгулярны выраз для вымання поўнага імя дамена з усімі паддаменамі:

    Рэгулярны выраз для вымання дамена другога ўзроўню без паддаменаў:

    Вось як можна атрымаць часткі тэксту ў 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 Else RegExpExtract = matches.Item(instance_num - 1) End If End If Функцыя выхаду ErrHandl: RegExpExtract = CVErr(xlErrValue) End Function

    Калі ў вас мала вопыту працы з VBA, пакрокавае кіраўніцтва карыстальніка можа апынуцца карысным: Як уставіць код VBA ў Excel.

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

    Сінтаксіс RegExpExtract

    Функцыя RegExpExtract шукае ва ўваходным радку значэнні, якія адпавядаюць рэгулярнаму выразу, і здабывае адно ці ўсе супадзенні.

    Функцыя мае наступны сінтаксіс :

    RegExpExtract(text, pattern, [instance_num], [match_case])

    Where:

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

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

    4 рэчы, якія вы павінны ведаць аб RegExpExtract

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

    1. Па змаўчанні функцыя вяртае ўсе знойдзеныя супадзенні ў суседнія ячэйкі, як паказана ў гэтым прыкладзе. Каб атрымаць пэўны выпадак, увядзіце адпаведны лік у аргумент instance_num .
    2. Па змаўчанні функцыя адчувальная да рэгістра . Для супастаўлення без уліку рэгістра ўсталюйце для аргумента match_case значэнне FALSE. З-за абмежаванняў VBA канструкцыя без уліку рэгістра (?i) не будзе працаваць.
    3. Калі сапраўдны шаблон не знойдзены , функцыя нічога не вяртае (пусты радок).
    4. Калі шаблон несапраўдны , #VALUE! адбываецца памылка.

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

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

    Рэгулярны выраз для вылучэння ліку з радка

    Вынікаючы асноўнай максіме навучання "ад простага да складанага", мы пачнем з вельмі простага выпадку: выманне ліку з радка.

    Першае, што вам трэба вырашыць, гэта які лік атрымаць: першы, апошні, канкрэтнае з'яўленне або ўсе лічбы.

    Выняць першае лік

    Гэта так проста, як можа атрымаць рэгулярны выраз. Улічваючы, што \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 .
    • Формула для вылучэння усіх лікаў абмяркоўваецца ў наступным прыкладзе.

    Рэгулярны выраз для вылучэння ўсіх супадзенняў

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

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

    =RegExpExtract(A2, "\d+")

    Формула выдатна працуе для адной ячэйкі, але паводзіны адрозніваюцца ў Dynamic Array 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, формула не будзе працаваць у старых версіях.

    Рэгулярны выраз для вымання тэксту з радка

    Выманне тэксту з літарна-лічбавы радок - даволі складаная задача ў Excel. З рэгулярным выразам гэта становіцца так проста, як пірог. Проста выкарыстоўвайце адмоўлены клас, каб супаставіць усё, што не з'яўляецца лічбай.

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

    Каб атрымаць падрадкі ў асобных ячэйках (дыяпазон разліву) , формула:

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

    Каб вывесці ўсе супадзенні ў адну ячэйку, укладзіце функцыю RegExpExtract у TEXTJOIN наступным чынам:

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

    Regex to атрымаць адрас электроннай пошты з радка

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

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

    Раздзяленне гэтага рэгулярнага выразу , вось што мы атрымліваем:

    • [\w\.\-]+ гэта імя карыстальніка, якое можа ўключаць 1 або больш літар і лічбаў, падкрэсліванне, кропкі і злучок.
    • Сімвал @
    • [A-Za-z0-9\.\-]+ - гэта даменнае імя, якое складаецца з: вялікіх і малых літар, лічбаў, злучкоў і кропак (у выпадкусубдаменаў). Ніжняе падкрэсліванне тут не дазваляецца, таму замест \w выкарыстоўваюцца 3 розныя наборы сімвалаў (напрыклад, A-Z a-z і 0-9), якія адпавядаюць любой літары, лічбе або падкрэсліванню.
    • \.[A-Za-z ]{2,24} з'яўляецца даменам верхняга ўзроўню. Складаецца з кропкі, за якой ідуць вялікія і малыя літары. Большасць даменаў верхняга ўзроўню складаюцца з 3 літар (напрыклад, .com .org, .edu і г.д.), але тэарэтычна яны могуць утрымліваць ад 2 да 24 літар (самы доўгі зарэгістраваны TLD).

    Мяркуючы, што радок знаходзіцца ў A5, а шаблон у A2, формула для вымання адраса электроннай пошты:

    =RegExpExtract(A5, $A$2)

    Рэгулярны выраз для вымання дамена з электроннай пошты

    Калі ён прыходзіць да здабывання дамена электроннай пошты, першая думка, якая прыходзіць у галаву, гэта выкарыстанне групы захопу для пошуку тэксту, які ідзе адразу пасля сімвала @.

    Шаблон : @([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 для выцягвання тэксту паміж двума сімваламі таксама будзе працаваць для вылучэння тэксту паміж дзвюма радкамі.

    Напрыклад, каб атрымаць усё паміж "test 1" і "test 2", выкарыстоўвайце наступны рэгулярны выраз.

    Шаблон : тэст 1(.*?)тэст 2

    Поўная формула:

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

    Рэгулярны выраз для вымання дамена з URL

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

    Каб атрымаць поўнае даменнае імя , уключаючы субдамены

    Шаблон : (?: https?\:

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