Talaan ng nilalaman
Sa tutorial na ito, matututunan mo kung paano gumamit ng mga regular na expression sa Excel para maghanap at mag-extract ng mga substring na tumutugma sa isang partikular na pattern.
Nagbibigay ang Microsoft Excel ng ilang function para mag-extract ng text mula sa mga cell. Ang mga function na iyon ay maaaring makayanan ang karamihan ng mga hamon sa pagkuha ng string sa iyong mga worksheet. Karamihan, ngunit hindi lahat. Kapag ang Text function ay natitisod, ang mga regular na expression ay darating upang iligtas. Maghintay... Walang RegEx function ang Excel! Totoo, walang mga inbuilt function. Ngunit walang makakapigil sa iyo na gamitin ang sarili mong gamit :)
Excel VBA Regex function na mag-extract ng mga string
Upang magdagdag ng custom na Regex Extract function sa iyong Excel, i-paste ang sumusunod na code sa VBA editor. Upang paganahin ang mga regular na expression sa VBA, ginagamit namin ang built-in na Microsoft RegExp object.
Pampublikong Function RegExpExtract(text As String , pattern As String , Optional instance_num As Integer = 0, Opsyonal match_case As Boolean = True ) Dim text_matches() Bilang String Dim matches_index Bilang Integer Sa Error PumuntaTo ErrHandl RegExpExtract = "" Itakda ang 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) Para sa matches_index = 0 ToVBA RegExp, hinihikayat ko kayong basahin ang susunod na bahagi na tumatalakay sa mas makapangyarihang .NET Regex function.Custom .NET based Regex function para mag-extract ng text sa Excel
Hindi tulad ng VBA RegExp function na maaaring isulat ng sinumang gumagamit ng Excel, ang NET RegEx ay ang kaharian ng developer. Sinusuportahan ng Microsoft .NET Framework ang full-feature na regular na expression syntax na katugma sa Perl 5. Ang artikulong ito ay hindi magtuturo sa iyo kung paano magsulat ng mga ganoong function (Ako ay hindi isang programmer at walang kaunting ideya kung paano gawin iyon :)
Apat na makapangyarihang function na naproseso ng karaniwang .NET RegEx engine ay isinulat na ng aming mga developer at kasama sa Ultimate Suite. Sa ibaba, ipapakita namin ang ilang praktikal na paggamit ng function na espesyal na idinisenyo para sa pag-extract ng text sa Excel.
Tip. Para sa impormasyon tungkol sa .NET Regex syntax, mangyaring sumangguni sa .NET Regular Expression Language.
Paano mag-extract ng mga sting sa Excel gamit ang mga regular na expression
Ipagpalagay na mayroon kang pinakabagong bersyon ng Ultimate Suite na naka-install, ang pag-extract ng text gamit ang mga regular na expression ay bumaba sa dalawang hakbang na ito:
- Sa tab na Ablebits Data , sa grupong Text , i-click ang Regex Tools .
- Sa pane ng Regex Tools , piliin ang source data, ilagay ang iyong Regex pattern, at piliin ang opsyong Extract . Upang makuha ang resulta bilang custom na function, hindi isang value, piliin ang Insert as a formula checkkahon. Kapag tapos na, i-click ang button na I-extract .
Lalabas ang mga resulta sa isang bagong column sa kanan ng iyong orihinal na data:
AblebitsRegexExtract syntax
Ang aming custom na function ay may sumusunod na syntax:
AblebitsRegexExtract(reference, regular_expression)Kung saan:
- Reference (kinakailangan) - isang reference sa cell na naglalaman ng source string.
- Regular_expression (kinakailangan) - ang regex pattern upang tumugma.
Mahalagang tala! Gumagana lang ang function sa mga machine na may Ultimate Suite for Excel na naka-install.
Mga tala sa paggamit
Upang gawing mas maayos ang curve ng iyong pag-aaral at mas kasiya-siya ang iyong karanasan, mangyaring bigyang pansin ang mga puntong ito:
- Upang gumawa ng formula, maaari mong gamitin ang aming Regex Tools , o ang dialog ng Excel na Insert function , o i-type ang buong pangalan ng function sa isang cell. Kapag naipasok na ang formula, maaari mo itong pamahalaan (i-edit, kopyahin o ilipat) tulad ng anumang katutubong formula.
- Ang pattern na ilalagay mo sa pane ng Regex Tools ay mapupunta sa 2nd argument. Posible rin na panatilihin ang isang regular na expression sa isang hiwalay na cell. Sa kasong ito, gumamit lang ng cell reference para sa 2nd argument.
- Kinukuha ng function ang first found match .
- Bilang default, ang function ay case -sensitibo . Para sa case-insensitive na pagtutugma, gamitin ang (?i) pattern.
- Kung hindi mahanap ang isang tugma, isang #N/A error angibinalik.
Regex upang i-extract ang string sa pagitan ng dalawang character
Upang makakuha ng text sa pagitan ng dalawang character, maaari mong gamitin ang alinman sa grupong kumukuha o tumingin-tingin.
Tara sabihin na naghahanap ka upang kunin ang teksto sa pagitan ng mga bracket. Ang isang grupong kumukuha ay ang pinakamadaling paraan.
Pattern 1 : \[(.*?)\]
Sa positibong pagtingin sa likod at pagtingin sa unahan, ang magiging resulta ay eksaktong ang parehong.
Pattern 2 : (?<=\[)(.*?)(?=\])
Paki-pansin na ang aming grupong kumukuha (.*?) ay nagsasagawa ng tamad na paghahanap para sa teksto sa pagitan ng dalawang bracket - mula sa una [ hanggang sa una ]. Ang isang kumukuha na grupo na walang tandang pananong (.*) ay gagawa ng matakaw na paghahanap at kukunin ang lahat mula sa una [ hanggang sa huli ].
Gamit ang pattern sa A2, ang formula ay napupunta bilang sumusunod:
=AblebitsRegexExtract(A5, $A$2)
Paano makuha ang lahat ng mga tugma
Tulad ng nabanggit na, ang AblebitsRegexExtract function ay maaari lamang mag-extract ng isang tugma. Upang makuha ang lahat ng mga tugma, maaari mong gamitin ang VBA function na napag-usapan namin kanina. Gayunpaman, mayroong isang caveat - hindi sinusuportahan ng VBA RegExp ang pagkuha ng mga grupo, kaya ibabalik din ng pattern sa itaas ang mga "boundary" na character, mga bracket sa aming kaso.
=TEXTJOIN(" ", TRUE, RegExpExtract(A5, $A$2))
Upang maalis sa mga bracket, PALITAN ang mga ito ng mga walang laman na string ("") gamit ang formula na ito:
=SUBSTITUTE(SUBSTITUTE(TEXTJOIN(", ", TRUE, RegExpExtract(A5, $A$2)), "]", ""),"[","")
Para sa mas madaling mabasa, gumagamit kami ng kuwit para sa delimiter.
Regex para mag-extract ng text sa pagitan ng dalawang string
Ang diskarte na ginawa naminbigyang-kahulugan ito nang literal).
Depende sa kung aling regular na expression ang ipinasok sa A2, ang formula sa ibaba ay magbubunga ng iba't ibang resulta:
=AblebitsRegexExtract(A5, $A$2)
Regex para i-extract ang buong domain name kasama ang lahat ng subdomain:
Regex para i-extract ang isang second-level domain na walang mga subdomain:
Iyan ay kung paano mag-extract ng mga bahagi ng text sa Excel gamit ang mga regular na expression. Salamat sa pagbabasa at umaasa akong makita ka sa aming blog sa susunod na linggo!
Mga available na download
Mga halimbawa ng Excel Regex Extract (.xlsm file)
Ultimate Suite trial version (.exe file)
\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 Exit Function ErrHandl: RegValuexlErr Function = CVErr() EndExtractKung wala kang kaunting karanasan sa VBA, maaaring makatulong ang sunud-sunod na gabay sa gumagamit: Paano magpasok ng VBA code sa Excel.
Tandaan. Para gumana ang function, tiyaking i-save ang iyong file bilang isang workbook na naka-enable sa macro (.xlsm).
RegExpExtract syntax
Ang RegExpExtract function ay naghahanap ng input string para sa mga value na tumutugma sa isang regular na expression at nag-extract ng isa o lahat ng tugma.
Ang function ay may sumusunod na syntax :
RegExpExtract(text, pattern, [instance_num], [match_case])Kung saan:
- Text (kinakailangan) - ang text string para maghanap.
- Pattern (kinakailangan) - ang regular na expression upang tumugma. Kapag direktang ibinigay sa isang formula, ang pattern ay dapat na nakapaloob sa double quotation marks.
- Instance_num (opsyonal) - isang serial number na nagsasaad kung aling instance ang i-extract. Kung aalisin, ibinabalik ang lahat ng nahanap na tugma (default).
- Match_case (opsyonal) - tinutukoy kung tutugma o balewalain ang text case. Kung TAMA o inalis (default), isasagawa ang case-sensitive na pagtutugma; kung FALSE - case-insensitive.
Gumagana ang function sa lahat ng bersyon ng Excel 365, Excel 2021, Excel2019, Excel 2016, Excel 2013 at Excel 2010.
4 na bagay na dapat mong malaman tungkol sa RegExpExtract
Upang epektibong magamit ang function sa iyong Excel, may ilang mahahalagang bagay na dapat pansinin:
- Bilang default, ibinabalik ng function ang lahat ng nahanap na tugma sa mga kalapit na cell tulad ng ipinapakita sa halimbawang ito. Upang makakuha ng partikular na pangyayari, magbigay ng katumbas na numero sa instance_num argument.
- Bilang default, ang function ay case-sensitive . Para sa case-insensitive na pagtutugma, itakda ang match_case argument sa FALSE. Dahil sa mga limitasyon ng VBA, hindi gagana ang case-insensitive na construct (?i).
- Kung hindi makita ang isang wastong pattern , walang ibabalik ang function (empty string).
- Kung hindi wasto ang pattern , isang #VALUE! nagkakaroon ng error.
Bago mo simulang gamitin ang custom na function na ito sa iyong mga worksheet, kailangan mong maunawaan kung ano ang kaya nito, tama ba? Ang mga halimbawa sa ibaba ay sumasaklaw sa ilang karaniwang mga kaso ng paggamit at ipinapaliwanag kung bakit maaaring mag-iba ang gawi sa Dynamic Array Excel (Microsoft 365 at Excel 2021) at tradisyonal na Excel (2019 at mas lumang mga bersyon).
Tandaan. Ang mga halimbawa ng out regex ay isinulat para sa mga simpleng set ng data. Hindi namin magagarantiya na gagana sila nang walang kamali-mali sa iyong mga tunay na worksheet. Ang mga may karanasan sa regex ay sasang-ayon na ang pagsusulat ng mga regular na expression ay isang walang katapusang daan patungo sa pagiging perpekto - halos palaging may paraan upang makagawaito ay mas elegante o may kakayahang pangasiwaan ang mas malawak na hanay ng input data.
Regex para kunin ang numero mula sa string
Sumusunod sa pangunahing kasabihan ng pagtuturo ng "mula sa simple hanggang sa kumplikado", magsisimula tayo sa isang napakasimpleng kaso: pagkuha ng numero mula sa string.
Ang ang unang bagay na mapagpasyahan mo ay kung aling numero ang kukunin: una, huli, partikular na pangyayari o lahat ng numero.
I-extract ang unang numero
Ito ay kasing simple ng makukuha ng regex. Dahil ang \d ay nangangahulugang anumang digit mula 0 hanggang 9, at ang + ay nangangahulugang isa o higit pang beses, ang aming regular na expression ay ganito ang form:
Pattern : \d+
Itakda instance_num hanggang 1 at makukuha mo ang gustong resulta:
=RegExpExtract(A5, "\d+", 1)
Kung saan A5 ang orihinal na string.
Para sa kaginhawahan, maaari kang mag-input ang pattern sa isang paunang natukoy na cell ($A$2 ) at i-lock ang address nito gamit ang $ sign:
=RegExpExtract(A5, $A$2, 1)
Kunin ang huling numero
Upang i-extract ang huling numero sa isang string , narito ang pattern na gagamitin:
Pattern : (\d+)(?!.*\d)
Isinalin sa isang wika ng tao , sabi nito: maghanap ng numero na hindi sinusundan (kahit saan, hindi lang kaagad) ng alinmang numero. Para ipahayag ito, gumagamit kami ng negatibong lookahead (?!.*\d), na nangangahulugang sa kanan ng pattern ay dapat walang ibang digit (\d) kahit gaano pa karaming character ang nauna rito.
=RegExpExtract(A5, "(\d+)(?!.*\d)")
Mga Tip:
- Upang makakuha ng partikular na pangyayari , gamitin ang \d+ para sa pattern at isang naaangkop na serialnumero para sa instance_num .
- Ang formula para i-extract ang lahat ng numero ay tinatalakay sa susunod na halimbawa.
Regex para i-extract ang lahat ng tugma
Itulak pa ang aming halimbawa, ipagpalagay na gusto mong makuha ang lahat ng numero mula sa isang string, hindi lang isa.
Tulad ng natatandaan mo, ang bilang ng mga nakuhang tugma ay kinokontrol ng opsyonal na instance_num argumento. Ang default ay lahat ng tugma, kaya aalisin mo lang ang parameter na ito:
=RegExpExtract(A2, "\d+")
Ang formula ay gumagana nang maganda para sa isang cell, ngunit ang gawi ay naiiba sa Dynamic Array Excel at mga hindi dynamic na bersyon.
Excel 365 at Excel 2021
Dahil sa suporta para sa mga dynamic na array, awtomatikong dumaloy ang isang regular na formula sa pinakamaraming cell kung kinakailangan upang ipakita ang lahat ng kinakalkulang resulta. Sa mga tuntunin ng Excel, tinatawag itong spilled range:
Excel 2019 at mas mababa
Sa pre-dynamic na Excel, isang tugma lang ang ibabalik ng formula sa itaas. Upang makakuha ng maraming tugma, kailangan mong gawin itong array formula. Para dito, pumili ng hanay ng mga cell, i-type ang formula, at pindutin ang Ctrl + Shift + Enter upang kumpletuhin ito.
Ang isang downside ng diskarteng ito ay isang grupo ng #N/A error na lumalabas sa "mga karagdagang cell" . Sa kasamaang palad, walang magagawa tungkol dito (ni IFERROR o IFNA ay hindi maaaring ayusin ito, sayang).
I-extract ang lahat ng tugma sa isang cell
Kapag nagpoproseso ng column ng data, halatang hindi gagana ang diskarte sa itaas. Sa kasong ito, isang perpektong solusyonay ibabalik ang lahat ng mga tugma sa isang cell. Upang magawa ito, ihatid ang mga resulta ng RegExpExtract sa TEXTJOIN function at paghiwalayin ang mga ito gamit ang anumang delimiter na gusto mo, sabihin ang isang kuwit at puwang:
=TEXTJOIN(", ", TRUE, RegExpExtract(A5, "\d+"))
Tandaan. Dahil available lang ang TEXTJOIN function sa Excel para sa Microsoft 365, Excel 2021 at Excel 2019, hindi gagana ang formula sa mga mas lumang bersyon.
Regex para mag-extract ng text mula sa string
Pag-extract ng text mula sa isang alphanumeric string ay isang mahirap na gawain sa Excel. Sa regex, nagiging kasingdali ng pie. Gumamit lang ng negated class para tumugma sa lahat ng hindi digit.
Pattern : [^\d]+
Upang makakuha ng mga substring sa mga indibidwal na cell (spill range) , ang formula ay:
=RegExpExtract(A5, "[^\d]+")
Upang i-output ang lahat ng tugma sa isang cell, ilagay ang RegExpExtract function sa TEXTJOIN tulad nito:
=TEXTJOIN("", TRUE, RegExpExtract(A5, "[^\d]+"))
Regex sa i-extract ang email address mula sa string
Upang maglabas ng email address mula sa isang string na naglalaman ng maraming iba't ibang impormasyon, magsulat ng regular na expression na ginagaya ang istraktura ng email address.
Pattern : [\w\.\-]+@[A-Za-z0-9\.\-]+\.[A-Za-z]{2,24}
Pagsira sa regex na ito , narito ang makukuha namin:
- [\w\.\-]+ ay isang username na maaaring may kasamang 1 o higit pang alphanumeric na character, underscore, tuldok at gitling.
- @ simbolo
- [A-Za-z0-9\.\-]+ ay isang domain name na binubuo ng: uppercase at lowercase na letra, digit, hyphen at tuldok (kung sakalingng mga subdomain). Hindi pinapayagan ang mga underscore dito, kaya 3 magkakaibang set ng character (gaya ng A-Z a-z at 0-9) ang ginagamit sa halip na \w na tumutugma sa anumang titik, digit o underscore.
- \.[A-Za-z ]{2,24} ay isang top-level na domain. Binubuo ng isang tuldok na sinusundan ng malalaking titik at maliliit na titik. Karamihan sa mga top-level na domain ay 3-letra ang haba (hal. .com .org, .edu, atbp.), ngunit sa teorya maaari itong maglaman ng mula 2 hanggang 24 na titik (ang pinakamahabang nakarehistrong TLD).
Ipagpalagay na ang string ay nasa A5 at ang pattern sa A2, ang formula para mag-extract ng email address ay:
=RegExpExtract(A5, $A$2)
Regex para i-extract ang domain mula sa email
Kapag ito pagdating sa pag-extract ng domain ng email, ang unang pumasok sa isip ay ang paggamit ng grupong kumukuha upang maghanap ng text na agad na sumusunod sa @ character.
Pattern : @([A-Za-z0 -9\.\-]+\.[A-Za-z]{2,24})
Ihain ito sa aming RegExp function:
=RegExpExtract(A5, "@([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})")
At makukuha mo ang resultang ito:
Gamit ang mga klasikong regular na expression, anumang bagay sa labas ng grupong kumukuha ay hindi kasama sa pagkuha. Walang nakakaalam kung bakit naiiba ang paggana ng VBA RegEx at kinukuha rin ang "@". Upang maalis ito, maaari mong alisin ang unang character mula sa resulta sa pamamagitan ng pagpapalit nito ng walang laman na string.
=REPLACE(RegExpExtract(A5, "@([a-z\d][a-z\d\-\.]*\.[a-z]{2,})", 1, FALSE), 1, 1, "")
Regular na expression upang kunin ang mga numero ng telepono
Mga numero ng telepono maaaring isulat sa maraming iba't ibang paraan, kaya naman halos imposible na makabuo ng solusyon na gumagana sa ilalim ng lahat(\d{4}mula sa string
Ang isang regular na expression para sa pag-extract ng petsa ay depende sa format kung saan lumalabas ang petsa sa loob ng isang string. Halimbawa:
Upang mag-extract ng mga petsa tulad ng 1/1/21 o 01/01/2021, ang regex ay: \d{1,2}\/\d{1,2}\/(\d {4}mga pangyayari. Gayunpaman, maaari mong isulat ang lahat ng format na ginamit sa iyong dataset at subukang itugma ang mga ito.
Para sa halimbawang ito, gagawa kami ng regex na kukuha ng mga numero ng telepono sa alinman sa mga format na ito:
(123) 345-6789 (123) 345 6789 (123)3456789 123- 345-6789 | 123.345.6789 123 345 6789 1233456789 |
Pattern : \(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b
- Ang unang bahagi na \(?\d{3} ay tumutugma sa zero o isang opening parenthesis na sinusundan ng tatlong digit d{3}.
- Ang bahaging [-\. \)]* ay nangangahulugang anumang character sa mga square bracket na lumalabas nang 0 o higit pang beses: gitling, tuldok, espasyo o pansarang panaklong.
- Susunod, mayroon tayong tatlong digit na muli d{3} na sinusundan ng anumang gitling, tuldok o espasyo [-\. ]? lumalabas nang 0 o 1 beses.
- Pagkatapos nito, mayroong isang pangkat ng apat na digit \d{4}.
- Sa wakas, may hangganan ng salita \b na tumutukoy na isang numero ng telepono tayo hindi maaaring maging bahagi ng mas malaking numero ang hinahanap.
Ang kumpletong formula ay ganito ang hugis:
=RegExpExtract(A5, "\(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b")
Pakitandaan na ang regex sa itaas ay maaaring magbalik ng ilang false-positive na resulta gaya ng 123) 456 7899 o (123 456 7899. Inaayos ng bersyon sa ibaba ang mga isyung ito. Gayunpaman, gumagana lang ang syntax na ito sa mga function ng VBA RegExp, hindi sa mga classic na regular na expression.
Pattern : (\(\d{3}\)gagana rin para sa pag-extract ng text sa pagitan ng dalawang string.
Halimbawa, para makuha ang lahat sa pagitan ng "test 1" at "test 2", gamitin ang sumusunod na regular na expression.
Pattern : test 1(.*?)test 2
Ang kumpletong formula ay:
=AblebitsRegexExtract(A5, "test 1(.*?)test 2")
Regex para kunin ang domain mula sa URL
Kahit na may mga regular na expression, ang pagkuha ng mga domain name mula sa mga URL ay hindi isang maliit na gawain. Ang pangunahing elemento na gumagawa ng lansihin ay ang mga pangkat na hindi kumukuha. Depende sa iyong pangunahing layunin, pumili ng isa sa mga regexe sa ibaba.
Upang makakuha ng buong domain name kasama ang mga subdomain
Pattern : (?: https?\: