Ynhâldsopjefte
Yn dizze tutorial sille jo leare hoe't jo reguliere útdrukkingen yn Excel brûke om substrings te finen en út te heljen dy't oerienkomme mei in opjûn patroan.
Microsoft Excel biedt in oantal funksjes om tekst te ekstrahearjen út sellen. Dy funksjes kinne omgean mei de measte útdagings foar string-ekstraksje yn jo wurkblêden. De measte, mar net allegear. As de tekstfunksjes stroffelje, komme reguliere útdrukkingen te rêden. Wachtsje ... Excel hat gjin RegEx-funksjes! Wier, gjin ynboude funksjes. Mar d'r is neat dat jo soe foarkomme om jo eigen te brûken :)
Excel VBA Regex-funksje om stringen te ekstrahearjen
Om in oanpaste Regex-úttrekfunksje ta te foegjen oan jo Excel, plak de folgjende koade yn 'e VBA-bewurker. Om reguliere útdrukkingen yn VBA yn te skeakeljen, brûke wy it ynboude Microsoft RegExp-objekt.
Publike funksje 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 By Flater GoTo ErrHandl RegExpExtract = "" Set regex = CreateObject ("VBScript.RegExp") regex.pattern = pattern regex.Global = True regex.MultiLine = Wier As Wier = match_case Dan regex. ignorecase = False Else regex.ignorecase = Wier Ein As Set oerienkomt = regex.Execute (tekst) As 0 & lt; matches.Count Then If (0 = instance_num) Then ReDim text_matches(matches.Count - 1, 0) Foar matches_index = 0 ToVBA RegExp, ik moedigje jo oan om it folgjende diel te lêzen dat in protte machtiger .NET Regex-funksjes besprekt.Aanpaste .NET-basearre Regex-funksje om tekst te ekstrahearjen yn Excel
Oars as VBA RegExp-funksjes dy't kin skreaun wurde troch elke Excel-brûker, .NET RegEx is it ryk fan 'e ûntwikkelders. It Microsoft .NET Framework stipet syntaksis foar reguliere ekspresje mei folsleine funksjes kompatibel mei Perl 5. Dit artikel sil jo net leare hoe't jo sokke funksjes skriuwe (ik bin gjin programmeur en haw gjin minste idee hoe't jo dat dwaan moatte :)
Fjouwer krêftige funksjes ferwurke troch de standert .NET RegEx-motor binne al skreaun troch ús ûntwikkelders en opnommen yn Ultimate Suite. Hjirûnder sille wy wat praktyske gebrûk fan 'e funksje sjen litte dy't spesjaal ûntworpen is foar it ekstrahearjen fan tekst yn Excel.
Tip. Foar ynformaasje oer de .NET Regex-syntaksis, ferwize nei .NET Regular Expression Language.
Hoe kinne jo stings ekstrahearje yn Excel mei reguliere útdrukkingen
As jo oannimme dat jo de lêste ferzje fan Ultimate Suite ynstalleare hawwe, komt it ekstrahearjen fan tekst mei reguliere útdrukkingen del op dizze twa stappen:
- Op de Ablebits Data ljepper, yn de Tekst groep, klik Regex Tools .
- Selektearje yn it paniel Regex-ark de boarnegegevens, fier jo Regex-patroan yn en kies de opsje Extract . Om it resultaat te krijen as in oanpaste funksje, net as in wearde, selektearje de Foegje as formule yn kontrôledoaze. As it dien is, klikje jo op de knop Extract .
De resultaten sille ferskine yn in nije kolom rjochts fan jo orizjinele gegevens:
AblebitsRegexExtract syntaksis
Us oanpaste funksje hat de folgjende syntaksis:
AblebitsRegexExtract(reference, regular_expression)Wêr:
- Referinsje (ferplicht) - in ferwizing nei de sel mei de boarnestring.
- Reguliere_ekspresje (ferplicht) - it regex-patroan dat oerienkomt.
Wichtige opmerking! De funksje wurket allinnich op 'e masines mei Ultimate Suite foar Excel ynstallearre.
Gebrûksnotysjes
Om jo learkurve soepeler te meitsjen en jo ûnderfining nofliker te meitsjen, jouwe jo omtinken oan dizze punten:
- Om in formule te meitsjen, kinne jo ús Regex-ark brûke, of it dialoochfinster Funksje ynfoegje fan Excel, of typ de folsleine funksjenamme yn in sel. Sadree't de formule is ynfoege, kinne jo it beheare (bewurkje, kopiearje of ferpleatse) lykas elke native formule.
- It patroan dat jo ynfiere op it Regex Tools -paniel giet nei it 2e argumint. It is ek mooglik om in reguliere ekspresje yn in aparte sel te hâlden. Brûk yn dit gefal gewoan in selferwizing foar it 2e argumint.
- De funksje ekstrahearret de earst fûn wedstriid .
- Standert is de funksje case -gefoel . Foar haadletter-ûngefoelige oerienkomst, brûk it (?i) patroan.
- As in oerienkomst net fûn wurdt, is in #N/A flaterweromjûn.
Regex om string tusken twa tekens út te heljen
Om tekst tusken twa karakters te krijen, kinne jo of in fêstlizzende groep brûke of omhinne sjen.
Litte wy sis dat jo sykje om tekst tusken heakjes út te heljen. In fêstlizzende groep is de maklikste manier.
Patroan 1 : \[(.*?)\]
Mei in positive efterútsjoch en foarútsjoch sil it resultaat krekt wêze itselde.
Patroan 2 : (?<=\[)(.*?)(?=\])
Let op dat ús fêstlizzende groep (.*?) fiert in loai sykjen út foar tekst tusken twa heakjes - fan de earste [ oant de earste ]. In fêstlizzende groep sûnder fraachteken (.*) soe in gierich sykjen dwaan en alles fan de earste [ oant de lêste ] fêstlizze.
By it patroan yn A2 giet de formule as folget:
=AblebitsRegexExtract(A5, $A$2)
Hoe kinne jo alle wedstriden krije
Lykas al neamd, kin de funksje AblebitsRegexExtract mar ien wedstriid útpakke. Om alle wedstriden te krijen, kinne jo de VBA-funksje brûke dy't wy earder besprutsen hawwe. D'r is lykwols ien warskôging - VBA RegExp stipet gjin fangen fan groepen, dus it boppesteande patroan sil ek de "grins" karakters weromjaan, heakjes yn ús gefal.
=TEXTJOIN(" ", TRUE, RegExpExtract(A5, $A$2))
Om kwyt te reitsjen fan de heakjes, SUBSTITUTE se mei lege snaren ("") mei dizze formule:
=SUBSTITUTE(SUBSTITUTE(TEXTJOIN(", ", TRUE, RegExpExtract(A5, $A$2)), "]", ""),"[","")
Foar bettere lêsberens brûke wy in komma foar skiedingsteken.
Regex om tekst tusken twa stringen te ekstrahearjen
De oanpak dy't wy hawwe wurkeynterpretearje it letterlik).
Ofhinklik fan hokker reguliere ekspresje yn A2 ynfierd wurdt, sil de ûndersteande formule ferskate resultaten produsearje:
=AblebitsRegexExtract(A5, $A$2)
Regex om de folsleine domeinnamme te ekstrahearjen mei alle subdomeinen:
Regex om in twadde nivo domein sûnder subdomeinen te ekstrahearjen:
Sa kinne jo dielen fan tekst ekstrahearje yn Excel mei help fan reguliere útdrukkingen. Ik tankje jo foar it lêzen en sjoch út nei jo te sjen op ús blog nije wike!
Beskikbere downloads
Excel Regex Extract-foarbylden (.xlsm-bestân)
Ultimate Suite-proefferzje (.exe-bestân)
\b(0?[0-9]matches.Count - 1 text_matches(matches_index, 0) = matches.Item(matches_index) Folgjende matches_index RegExpExtract = text_matches Else RegExpExtract = matches.Item(instance_num - 1) End If End If Exit Function ErrHandl: RegExpExtract = CVErction(xlEr) End FunrctionAs jo net folle ûnderfining hawwe mei VBA, kin in stap-foar-stap-brûkersgids nuttich wêze: Hoe VBA-koade ynfoegje yn Excel.
Opmerking. Foardat de funksje wurket, wês wis dat jo jo bestân bewarje as in macro-ynskeakele wurkboek (.xlsm).
RegExpExtract syntaksis
De funksje RegExpExtract siket in ynfierstring foar wearden dy't oerienkomme mei in reguliere ekspresje en ekstrahearje ien of alle oerienkomsten.
De funksje hat de folgjende syntaksis :
RegExpExtract(tekst, patroan, [instance_num], [match_case])Wêr:
- Tekst (ferplicht) - de tekststring om yn te sykjen.
- Patroan (ferplicht) - de reguliere ekspresje om te passen. As it direkt yn in formule oanlevere wurdt, moat it patroan omsletten wurde troch dûbele oanhalingstekens.
- Instance_num (opsjoneel) - in searjenûmer dat oanjout hokker eksimplaar ekstrahearje moat. As it weilitten wurdt, jout alle fûn oerienkomsten (standert) werom.
- Match_case (opsjoneel) - definiearret oft it oerienkomt mei of negearje tekstcase. As TRUE of weilitten (standert), wurdt case-sensitive matching útfierd; if FALSE - case-insensitive.
De funksje wurket yn alle ferzjes fan Excel 365, Excel 2021, Excel2019, Excel 2016, Excel 2013 en Excel 2010.
4 dingen dy't jo witte moatte oer RegExpExtract
Om de funksje effektyf yn jo Excel te brûken, binne d'r in pear wichtige dingen om op te nimmen:
- Standert jout de funksje alle fûn oerienkomsten werom yn oanbuorjende sellen lykas werjûn yn dit foarbyld. Om in spesifyk foarkommen te krijen, leverje in oerienkommende nûmer oan it argumint instance_num .
- Standert is de funksje hoofdlettergefoel . Stel it match_case -argumint yn op FALSE foar netgefoelige oerienkomst. Fanwege de VBA-beheinings sil it haadletterûngefoelige konstruksje (?i) net wurkje.
- As in jildich patroan net fûn wurdt , jout de funksje neat werom (lege tekenrige).
- As it patroan ûnjildich is , is in #VALUE! error occurs.
Foardat jo begjinne mei it brûken fan dizze oanpaste funksje yn jo wurkblêden, moatte jo begripe wat it yn steat is, krekt? De ûndersteande foarbylden dekke in pear gewoane gebrûksgefallen en ferklearje wêrom't it gedrach kin ferskille yn Dynamic Array Excel (Microsoft 365 en Excel 2021) en tradisjonele Excel (2019 en âldere ferzjes).
Opmerking. Ut regex foarbylden wurde skreaun foar fairy ienfâldige gegevens sets. Wy kinne net garandearje dat se flaterfrij sille wurkje yn jo echte wurkblêden. Dejingen dy't ûnderfining hawwe mei regex binne it iens dat it skriuwen fan reguliere útdrukkingen in nea einigjende wei nei perfeksje is - hast altyd is d'r in manier om te meitsjenit eleganter of by steat fan in ôfhanneljen in breder skala oan ynfier gegevens.
Regex om nûmer út tekenrige te ekstrahearjen
Nei it basisbeginsel fan it learen "fan ienfâldich nei kompleks", sille wy begjinne mei in heul gewoan gefal: getal ekstrahearje út tekenrige.
De it earste ding foar jo om te besluten is hokker nûmer te heljen: earste, lêste, spesifyk foarkommen of alle nûmers.
Earste nûmer útpakke
Dit is sa ienfâldich as regex kin krije. Jûn dat \d elk sifer betsjut fan 0 oant 9, en + ien of mear kearen betsjut, nimt ús reguliere ekspresje dizze foarm oan:
Patroan : \d+
Set instance_num oant 1 en jo krije it winske resultaat:
=RegExpExtract(A5, "\d+", 1)
Dêr't A5 de oarspronklike tekenrige is.
Foar it gemak kinne jo ynfiere it patroan yn in foarôf definieare sel ($A$2) en it adres beskoattelje mei it $ teken:
=RegExpExtract(A5, $A$2, 1)
Krij lêste nûmer
Om it lêste nûmer yn in tekenrige út te heljen , hjir is it patroan om te brûken:
Patroan : (\d+)(?!.*\d)
Oerset yn in minsklike taal , stiet der: fyn in nûmer dat net folge wurdt (oeral, net samar fuortendaliks) troch in oar nûmer. Om dit út te drukken brûke wy in negative lookahead (?!.*\d), wat betsjut dat der rjochts fan it patroan gjin oare sifer (\d) stean moat, nettsjinsteande hoefolle oare tekens der foar steane.
=RegExpExtract(A5, "(\d+)(?!.*\d)")
Tips:
- Om in spesifyk foarkommen te krijen, brûk \d+ foar patroan en in passende serialnûmer foar instance_num .
- De formule om alle nûmers te ekstrahearjen wurdt besprutsen yn it folgjende foarbyld.
Regex om alle wedstriden út te heljen
Sjoch ús foarbyld in bytsje fierder, stel dat jo alle nûmers fan in tekenrige krije wolle, net mar ien.
Sa't jo miskien ûnthâlde, wurdt it oantal ekstrahearre wedstriden regele troch de opsjonele instance_num argumint. De standert is alle oerienkomsten, sadat jo dizze parameter gewoanwei litte:
=RegExpExtract(A2, "\d+")
De formule wurket prachtich foar ien sel, mar it gedrach ferskilt yn Dynamic Array Excel en net-dynamyske ferzjes.
Excel 365 en Excel 2021
Troch stipe foar dynamyske arrays spielt in gewoane formule automatysk yn safolle sellen as nedich om alle berekkene resultaten wer te jaan. Yn termen fan Excel, wurdt dit in spield berik neamd:
Excel 2019 en leger
Yn pre-dynamyske Excel soe de boppesteande formule mar ien wedstriid werombringe. Om meardere wedstriden te krijen, moatte jo it in arrayformule meitsje. Selektearje hjirfoar in berik fan sellen, typ de formule, en druk op Ctrl + Shift + Enter om it te foltôgjen.
In neidiel fan dizze oanpak is in bosk #N/A flaters dy't ferskine yn "ekstra sellen" . Spitigernôch kin der neat oan dien wurde (noch IFERROR noch IFNA kinne it reparearje, helaas).
Alle oerienkomsten yn ien sel útpakke
By it ferwurkjen fan in kolom mei gegevens, sil de boppesteande oanpak fansels net wurkje. Yn dit gefal, in ideale oplossingsoe wêze werom alle wedstriden yn ien sel. Om it dien te hawwen, tsjinje de resultaten fan RegExpExtract oan 'e TEXTJOIN-funksje en skiede se mei elke skiedingsteken dy't jo wolle, sis in komma en in spaasje:
=TEXTJOIN(", ", TRUE, RegExpExtract(A5, "\d+"))
Opmerking. Om't de funksje TEXTJOIN allinnich beskikber is yn Excel foar Microsoft 365, Excel 2021 en Excel 2019, wurket de formule net yn âldere ferzjes.
Regex om tekst út tekenrige te heljen
Tekst útpakke út in alfanumerike tekenrige is nochal in útdaagjende taak yn Excel. Mei regex wurdt it sa maklik as in taart. Brûk gewoan in negearre klasse om alles te passen dat gjin sifer is.
Patroan : [^\d]+
Om substrings yn yndividuele sellen te krijen (spielberik) , de formule is:
=RegExpExtract(A5, "[^\d]+")
Om alle oerienkomsten yn ien sel út te fieren, nêst de RegExpExtract-funksje yn TEXTJOIN sa:
=TEXTJOIN("", TRUE, RegExpExtract(A5, "[^\d]+"))
Regex to ekstrahearje e-postadres út tekenrige
Om in e-mailadres út in tekenrige te heljen mei in protte ferskillende ynformaasje, skriuw in reguliere ekspresje dy't de struktuer fan e-mailadres replikearret.
Patroan : [\w\.\-]+@[A-Za-z0-9\.\-]+\.[A-Za-z]{2,24}
Dizze regex ôfbrekke , hjir is wat wy krije:
- [\w\.\-]+ is in brûkersnamme dy't 1 of mear alfanumerike tekens, ûnderstreken, stippen en koppeltekens befetsje kin.
- @-symboal
- [A-Za-z0-9\.\-]+ is in domeinnamme dy't bestiet út: haad- en lytse letters, sifers, koppeltekens en punten (yn gefalfan subdomeinen). Underscores binne hjir net tastien, dêrom wurde 3 ferskillende tekensets (lykas A-Z a-z en 0-9) brûkt ynstee fan \w dy't oerienkomt mei elke letter, sifer of underscore.
- \.[A-Za-z ]{2,24} is in top-nivo domein. Bestaat út in punt folge troch haad- en lytse letters. De measte domeinen op topnivo binne 3-letters lang (bgl. .com .org, .edu, ensfh.), mar yn teory kin it fan 2 oant 24 letters befetsje (de langste registrearre TLD).
Oannommen dat de tekenrige yn A5 is en it patroan yn A2, is de formule om in e-postadres te ekstrahearjen:
=RegExpExtract(A5, $A$2)
Regex om domein út e-post te ekstrahearjen
As it giet it om it ekstrahearjen fan e-postdomein, de earste gedachte dy't yn 't sin komt is it brûken fan in fêstlizzende groep om tekst te finen dy't direkt it @-karakter folget.
Patroan : @([A-Za-z0 -9\.\-]+\.[A-Za-z]{2,24})
Tsjinje it oan ús RegExp-funksje:
=RegExpExtract(A5, "@([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})")
En jo krije dit resultaat:
Mei klassike reguliere útdrukkingen is alles bûten in fêstlizzende groep net opnommen yn 'e ekstraksje. Nimmen wit wêrom VBA RegEx oars wurket en ek "@" fangt. Om it kwyt te reitsjen, kinne jo it earste karakter út it resultaat fuortsmite troch it te ferfangen troch in lege tekenrige.
=REPLACE(RegExpExtract(A5, "@([a-z\d][a-z\d\-\.]*\.[a-z]{2,})", 1, FALSE), 1, 1, "")
Reguliere ekspresje om telefoannûmers út te heljen
Telefoonnûmers kin op in protte ferskillende manieren skreaun wurde, en dêrom is it hast ûnmooglik om mei in oplossing te kommen dy't ûnder alles wurket(\d{4}from string
In reguliere útdrukking foar it ekstrahearjen fan in datum hinget ôf fan it formaat wêryn't de datum yn in tekenrige ferskynt. Bygelyks:
Om datums lykas 1/1/21 of 01/01/2021 út te heljen, is de regex: \d{1,2}\/\d{1,2}\/(\d {4}omstannichheden. Dochs kinne jo alle formaten opskriuwe dy't brûkt wurde yn jo dataset en besykje se te passen.
Foar dit foarbyld sille wy in regex meitsje dy't telefoannûmers ekstrahearje sil yn ien fan dizze formaten:
(123) 345-6789 (123) 345 6789 (123)3456789 123- 345-6789 | 123.345.6789 123 345 6789 1233456789 |
Patroan : \(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b
- It earste diel \(?\d{3} komt oerien mei nul of ien iepeningshaak folge troch trije sifers d{3}.
- It [-\. \)]* diel betsjut elk karakter tusken fjouwerkante heakjes dat 0 of mear kearen foarkomt: koppelteken, punt, spaasje of slothaakjes.
- Dêrnei hawwe wy wer trije sifers d{3} folge troch elk koppelteken, punt of spaasje [-\. ]? 0 of 1 kear ferskine.
- Dêrnei is der in groep fan fjouwer sifers \d{4}.
- Uteinlik is der in wurdgrins \b dy't definiearret dat in telefoannûmer dat wy binne sykjen kin net diel útmeitsje fan in grutter nûmer.
De folsleine formule nimt dizze foarm oan:
=RegExpExtract(A5, "\(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b")
Hâld der rekken mei dat de boppesteande regex in pear weromkomme kin falsk-positive resultaten lykas 123) 456 7899 of (123 456 7899. De ûndersteande ferzje reparearret dizze problemen. Dizze syntaksis wurket lykwols allinich yn VBA RegExp-funksjes, net yn klassike reguliere útdrukkingen.
Patroan : (\(\d{3}\)út foar it útlûken fan tekst tusken twa tekens sil ek wurkje foar it ekstrahearjen fan tekst tusken twa tekenrige.
Bygelyks, om alles te krijen tusken "test 1" en "test 2", brûk de folgjende reguliere ekspresje.
Patroan : test 1(.*?)test 2
De folsleine formule is:
=AblebitsRegexExtract(A5, "test 1(.*?)test 2")
Regex om domein út URL te ekstrahearjen
Sels mei reguliere útdrukkingen is it ekstrahearjen fan domeinnammen út URL's gjin triviale taak. It wichtichste elemint dat de trúk docht is net-fangende groepen. Ofhinklik fan jo úteinlike doel, kies ien fan 'e ûndersteande regexes.
Om in folsleine domeinnamme te krijen mei subdomeinen
Patroan : (?: https?\: