Редовни израз за издвајање стрингова у Екцел-у (једно или сва подударања)

  • Деле Ово
Michael Brown

Преглед садржаја

У овом водичу ћете научити како да користите регуларне изразе у Екцел-у да бисте пронашли и издвојили подстрингове који одговарају датом обрасцу.

Мицрософт Екцел пружа бројне функције за издвајање текста из ћелија. Те функције могу да се носе са већином изазова екстракције стрингова у вашим радним листовима. Већина, али не сви. Када се функције текста спотакну, регуларни изрази долазе у помоћ. Чекај… Екцел нема функције РегЕк! Истина, нема уграђених функција. Али не постоји ништа што би вас спречило да користите своје :)

    Екцел ВБА Регек функција за издвајање стрингова

    Да бисте додали прилагођену функцију Регек Ектрацт у свој Екцел, налепите следећи код у ВБА едитор. Да бисмо омогућили регуларне изразе у ВБА, користимо уграђени Мицрософт РегЕкп објекат.

    Јавна функција РегЕкпЕктрацт(текст као стринг, образац као стринг, опциони инстанце_нум као цео број = 0, опциони матцх_цасе као логички = тачно) Дим тект_матцхес() Ас Стринг Дим матцхес_индек Ас Интегер Он Еррор ГоТо ЕррХандл РегЕкпЕктрацт = "" Сет регек = ЦреатеОбјецт ( "ВБСцрипт.РегЕкп") регек.паттерн = паттерн регек.Глобал = Труе регек.МултиЛине = Труе Иф тхен Труе игнорецасе = Фалсе Елсе регек.игнорецасе = Труе Енд Ако се сет подудара = регек.Екецуте(тект) Ако је 0 &лт; матцхес.Цоунт Тхен Иф (0 = инстанце_нум) Тхен РеДим тект_матцхес(матцхес.Цоунт - 1, 0) За матцхес_индек = 0 ТоВБА РегЕкп, охрабрујем вас да прочитате следећи део који говори о много моћнијим .НЕТ Регек функцијама.

    Прилагођена .НЕТ базирана Регек функција за издвајање текста у Екцел

    За разлику од ВБА РегЕкп функција које може да напише било који корисник Екцел-а, .НЕТ РегЕк је област програмера. Мицрософт .НЕТ Фрамеворк подржава синтаксу регуларног израза са свим функцијама компатибилну са Перл 5. Овај чланак вас неће научити како да напишете такве функције (ја нисам програмер и немам ни најмању идеју како то да урадите :)

    Четири моћне функције које обрађује стандардни .НЕТ РегЕк механизам су већ написали наши програмери и укључене у Ултимате Суите. У наставку ћемо показати неке практичне употребе функције посебно дизајниране за издвајање текста у Екцел-у.

    Савет. За информације о .НЕТ Регек синтакси, погледајте .НЕТ Регулар Екпрессион Лангуаге.

    Како издвојити убоде у Екцел-у помоћу регуларних израза

    Под претпоставком да имате инсталирану најновију верзију Ултимате Суите-а, издвајање текста помоћу регуларних израза се своди на ова два корака:

    1. На картици Аблебитс Дата , у групи Тект кликните на Регек Тоолс .
    2. У окну Регек Тоолс изаберите изворне податке, унесите образац регуларног израза и изаберите опцију Ектрацт . Да бисте добили резултат као прилагођену функцију, а не вредност, потврдите избор Убаци као формулу кутија. Када завршите, кликните на дугме Издвоји .

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

    АблебитсРегекЕктрацт синтакса

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

    АблебитсРегекЕктрацт(референца, регулар_екпрессион)

    Где:

    • Референце (обавезно) - референца на ћелију која садржи изворни стринг.
    • Регулар_екпрессион (обавезно) - образац регуларног израза који се подудара.

    Важна напомена! Функција ради само на машинама са инсталираним Ултимате Суите фор Екцел.

    Напомене о коришћењу

    Да би ваша крива учења била глаткија и ваше искуство пријатније, обратите пажњу на ове тачке:

    1. Да бисте креирали формулу, можете користити наше Регек Тоолс или Екцелов дијалог Инсерт фунцтион или откуцати пуно име функције у ћелију. Једном када је формула уметнута, можете да управљате њом (уредите, копирате или преместите) као било којом природном формулом.
    2. Шаблон који унесете у окну Регек Тоолс иде на 2. аргумент. Такође је могуће задржати регуларни израз у посебној ћелији. У овом случају, само користите референцу ћелије за 2. аргумент.
    3. Функција издваја прво пронађено подударање .
    4. Подразумевано, функција је цасе -осетљив . За подударање без обзира на велика и мала слова, користите образац (?и).
    5. Ако подударање није пронађено, грешка #Н/А јевраћено.

    Регек за издвајање стринга између два знака

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

    Хајде да рецимо да желите да издвојите текст између заграда. Група за снимање је најлакши начин.

    Образац 1 : \[(.*?)\]

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

    Образац 2 : (?&лт;=\[)(.*?)(?=\])

    Обратите пажњу да наша група за снимање (.*?) врши лењу претрагу за текст између две заграде - од прве [ до прве ]. Група за снимање без знака питања (.*) би извршила похлепну претрагу и ухватила све од првог [ до последњег ].

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

    =AblebitsRegexExtract(A5, $A$2)

    Како добити сва подударања

    Као што је већ поменуто, функција АблебитсРегекЕктрацт може издвојити само једно подударање. Да бисте добили сва подударања, можете користити ВБА функцију о којој смо раније говорили. Међутим, постоји једно упозорење - ВБА РегЕкп не подржава хватање група, тако да ће горњи образац такође вратити "граничне" знакове, у нашем случају заграде.

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

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

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

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

    Регекс за издвајање текста између два низа

    Приступ који смо радилитумачи буквално).

  • (?:[А-За-з\д\-\.]{2,255}\.)? - група без хватања за идентификацију домена трећег, четвртог нивоа итд., ако их има ( мобилни у нашем узорку УРЛ адресе). У првом обрасцу, он је смештен у већу групу за хватање да би се сви такви поддомени укључили у екстракцију. Поддомен може имати од 2 до 255 знакова, отуда и квантификатор {2,255}.
  • ([А-За-з\д\-]{1,63}\.[А-За-з] {2,24}) - група за снимање за издвајање домена другог нивоа ( аблебитс ) и домена највишег нивоа ( цом ). Максимална дужина домена другог нивоа је 63 знака. Најдужи домен највишег нивоа који тренутно постоји садржи 24 знака.
  • У зависности од тога који регуларни израз је унесен у А2, формула испод ће дати различите резултате:

    =AblebitsRegexExtract(A5, $A$2)

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

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

    Тако можете извући делове текста у Екцел користећи регуларне изразе. Хвала вам што сте читали и радујем се што ћу вас видети на нашем блогу следеће недеље!

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

    Екцел Регек Ектрацт примери (.клсм датотека)

    Пробна верзија Ултимате Суите-а (.еке датотека)

    \б(0?[0-9]матцхес.Цоунт - 1 тект_матцхес(матцхес_индек, 0) = матцхес.Итем(матцхес_индек) Следећи матцхес_индек РегЕкпЕктрацт = тект_матцхес Елсе РегЕкпЕктрацт = матцхес.Итем(инстанце_нум - 1) Енд Иф Енд Иф Екит Фунцтион ЕррХандл: РегВЕррЕкпЕклуцтион = Ц Енд Иф Екит Фунцтион

    Ако имате мало искуства са ВБА-ом, може вам помоћи упутство за употребу корак по корак: Како уметнути ВБА код у Екцел.

    Напомена. Да би функција функционисала, обавезно сачувајте датотеку као радну свеску са омогућеним макроима (.клсм).

    Синтакса РегЕкпЕктрацт

    Функција РегЕкпЕктрацт претражује улазни низ за вредности које се подударају са регуларним изразом и издваја једно или сва подударања.

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

    РегЕкпЕктрацт(текст, образац, [број_инстанце], [матцх_цасе])

    Где:

    • Текст (обавезно) - текстуални низ за претрагу.
    • Образац (обавезно) - регуларни израз за подударање. Када се унесе директно у формулу, образац треба да буде стављен у двоструке наводнике.
    • Број_инстанце (опционо) - серијски број који означава коју инстанцу треба издвојити. Ако је изостављен, враћа сва пронађена подударања (подразумевано).
    • Матцх_цасе (опционо) - дефинише да ли ће се подударати или игнорисати велика и мала слова текста. Ако је ТРУЕ или изостављено (подразумевано), врши се подударање осетљиво на велика и мала слова; ако је ФАЛСЕ - не разликује велика и мала слова.

    Функција ради у свим верзијама програма Екцел 365, Екцел 2021, Екцел2019, Екцел 2016, Екцел 2013 и Екцел 2010.

    4 ствари које треба да знате о РегЕкпЕктрацт

    Да бисте ефикасно користили функцију у свом Екцел-у, постоји неколико важних ствари на које треба обратити пажњу:

    1. Подразумевано, функција враћа сва пронађена подударања у суседне ћелије као што је приказано у овом примеру. Да бисте добили специфично појављивање, унесите одговарајући број аргументу инстанце_нум .
    2. Подразумевано, функција је осетљива на велика и мала слова . За подударање без обзира на велика и мала слова, поставите аргумент матцх_цасе на ФАЛСЕ. Због ВБА ограничења, конструкција која не разликује велика и мала слова (?и) неће радити.
    3. Ако важећи образац није пронађен , функција не враћа ништа (празан стринг).
    4. Ако је образац неважећи , #ВАЛУЕ! долази до грешке.

    Пре него што почнете да користите ову прилагођену функцију у својим радним листовима, морате да разумете за шта је она способна, зар не? Примери у наставку покривају неколико уобичајених случајева употребе и објашњавају зашто се понашање може разликовати у Динамиц Арраи Екцел-у (Мицрософт 365 и Екцел 2021) и традиционалном Екцел-у (2019 и старије верзије).

    Напомена. Примери регуларних израза су написани за прилично једноставне скупове података. Не можемо гарантовати да ће радити беспрекорно у вашим правим радним листовима. Они који имају искуства са регуларним изразом сложили би се да је писање регуларних израза бескрајан пут ка савршенству – скоро увек постоји начин да сеелегантнији је или способан да рукује ширим спектром улазних података.

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

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

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

    Издвоји први број

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

    Образац : \д+

    Постави инстанце_нум до 1 и добићете жељени резултат:

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

    Где је А5 оригинални стринг.

    За практичност, можете да унесете образац у унапред дефинисаној ћелији ($А$2 ) и закључајте њену адресу знаком $:

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

    Преузми последњи број

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

    Образац : (\д+)(?!.*\д)

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

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

    Савети:

    • Да бисте добили специфичну појаву , користите \д+ за образац и одговарајућу серијуброј за инстанце_нум .
    • Формула за издвајање свих бројева је разматрана у следећем примеру.

    Регек за издвајање свих подударања

    Померајући наш пример мало даље, претпоставимо да желите да добијете све бројеве из низа, а не само један.

    Као што се можда сећате, број издвојених подударања контролише опциони број_инстанце аргумент. Подразумевана су сва подударања, тако да једноставно изоставите овај параметар:

    =RegExpExtract(A2, "\d+")

    Формула лепо функционише за једну ћелију, али понашање се разликује у Динамиц Арраи Екцел-у и нединамичким верзијама.

    Екцел 365 и Екцел 2021

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

    Екцел 2019 и нижи

    У пре-динамичком Екцел-у, горња формула би вратила само једно подударање. Да бисте добили више подударања, потребно је да то буде формула низа. За ово, изаберите опсег ћелија, откуцајте формулу и притисните Цтрл + Схифт + Ентер да бисте је довршили.

    Недостатак овог приступа је гомила #Н/А грешака које се појављују у „додатним ћелијама“ . Нажалост, ту се ништа не може учинити (ни ИФЕРРОР ни ИФНА то не могу поправити, авај).

    Издвоји сва подударања у једној ћелији

    Када обрађујемо колону података, горњи приступ очигледно неће радити. У овом случају, идеално решењеби враћао све утакмице у једној ћелији. Да бисте то урадили, послужите резултате РегЕкпЕктрацт функцији ТЕКСТЈОИН и раздвојите их било којим граничником који желите, реците зарезом и размаком:

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

    Напомена. Пошто је функција ТЕКСТЈОИН доступна само у програму Екцел за Мицрософт 365, Екцел 2021 и Екцел 2019, формула неће радити у старијим верзијама.

    Регекс за издвајање текста из стринга

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

    Образац : [^\д]+

    Да бисте добили подстрингове у појединачним ћелијама (опсег преливања) , формула је:

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

    Да бисте избацили сва подударања у једну ћелију, угнездите функцију РегЕкпЕктрацт у ТЕКСТЈОИН овако:

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

    Регек у издвоји адресу е-поште из стринга

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

    Образац : [\в\.\-]+@[А-За-з0-9\.\-]+\.[А-За-з]{2,24}

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

    • [\в\.\-]+ је корисничко име које може да садржи 1 или више алфанумеричких знакова, доњих црта, тачака и цртица.
    • @ симбол
    • [А-За-з0-9\.\-]+ је име домена које се састоји од: великих и малих слова, цифара, цртица и тачака (у случајуподдомена). Доње црте овде нису дозвољене, стога се користе 3 различита скупа знакова (као што су А-З а-з и 0-9) уместо \в који се подудара са било којим словом, цифром или доњом цртом.
    • \.[А-За-з] ]{2,24} је домен највишег нивоа. Састоји се од тачке иза које следе велика и мала слова. Већина домена највишег нивоа има 3 слова (нпр. .цом .орг, .еду, итд.), али у теорији може да садржи од 2 до 24 слова (најдужи регистровани ТЛД).

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

    =RegExpExtract(A5, $A$2)

    Регек за издвајање домена из е-поште

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

    Образац : @([А-За-з0 -9\.\-]+\.[А-За-з]{2,24})

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

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

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

    Са класичним регуларним изразима, све што је изван групе за хватање није укључено у екстракцију. Нико не зна зашто ВБА РегЕк ради другачије и хвата "@". Да бисте га се решили, можете уклонити први знак из резултата тако што ћете га заменити празним стрингом.

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

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

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

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

    Да бисте издвојили датуме као што су 1/1/21 или 01/01/2021, регуларни израз је: \д{1,2}\/\д{1,2}\/(\д {4}околности. Ипак, можете да запишете све формате који се користе у вашем скупу података и покушате да их упарите.

    За овај пример, креираћемо редовни израз који ће издвојити бројеве телефона у било ком од ових формата:

    (123) 345-6789

    (123) 345 6789

    (123)3456789

    123- 345-6789

    123.345.6789

    123 345 6789

    1233456789

    Образац : \(?\д{3}[-\. \)]*\д{3}[-\. ]?\д{4}\б

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

    Комплетна формула има овај облик:

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

    Имајте на уму да горњи регуларни израз може да врати неколико лажно позитивни резултати као што су 123) 456 7899 или (123 456 7899. Верзија у наставку решава ове проблеме. Међутим, ова синтакса функционише само у ВБА РегЕкп функцијама, не и у класичним регуларним изразима.

    Шаблон : (\(\д{3}\)оут за извлачење текста између два знака ће такође радити за издвајање текста између два низа.

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

    Образац : тест 1(.*?)тест 2

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

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

    Регек за издвајање домена из УРЛ-а

    Чак и са регуларним изразима, издвајање имена домена из УРЛ-ова није тривијалан задатак. Кључни елемент који ради трик је нехватање група. У зависности од вашег крајњег циља, изаберите један од доле наведених регуларних израза.

    Да бисте добили пуно име домена укључујући поддомене

    Образац : (?: хттпс?\:

    Мајкл Браун је посвећен технолошки ентузијаста са страшћу за поједностављење сложених процеса помоћу софтверских алата. Са више од деценије искуства у технолошкој индустрији, усавршио је своје вештине у Мицрософт Екцел-у и Оутлоок-у, као и у Гоогле табеле и документима. Мајклов блог посвећен је дељењу свог знања и стручности са другима, пружајући једноставне савете и упутства за побољшање продуктивности и ефикасности. Без обзира да ли сте искусан професионалац или почетник, Мајклов блог нуди вредне увиде и практичне савете како да на најбољи начин искористите ове основне софтверске алате.