Regex per extreure cadenes a Excel (una o totes les coincidències)

  • Comparteix Això
Michael Brown

En aquest tutorial, aprendràs a utilitzar expressions regulars a Excel per trobar i extreure subcadenes que coincideixin amb un patró determinat.

Microsoft Excel ofereix una sèrie de funcions per extreure text. de les cèl·lules. Aquestes funcions poden fer front a la majoria dels reptes d'extracció de cadenes dels vostres fulls de treball. La majoria, però no tots. Quan les funcions de text ensopeguen, les expressions regulars vénen a rescatar-se. Espera... Excel no té funcions RegEx! És cert, no hi ha funcions integrades. Però no hi ha res que us impedeixi utilitzar els vostres propis :)

    Funció d'Excel VBA Regex per extreure cadenes

    Per afegir una funció personalitzada d'extracte de Regex al vostre Excel, enganxeu el codi següent a l'editor VBA. Per habilitar expressions regulars a VBA, estem utilitzant l'objecte Microsoft RegExp integrat.

    Funció pública RegExpExtract(text As String , pattern As String , Optional instance_num As Integer = 0, Optional match_case As Boolean = True ) Dim text_matches() Com a cadena Dim matchs_index Com a enter en cas d'error GoTo ErrHandl RegExpExtract = "" Set regex = CreateObject ( "VBScript.RegExp") regex.pattern = patró regex.Global = True regex.MultiLine = True If True = match_case Aleshores regex. ignorecase = Fals Else regex.ignorecase = True End If Set matches = regex.Execute(text) If 0 < matchs.Count Then If (0 = instance_num) Then ReDim text_matches(matches.Count - 1, 0) For matchs_index = 0 ToVBA RegExp, us animo a llegir la següent part que tracta de funcions .NET Regex molt més potents.

    Funció de RegEx personalitzada basada en .NET per extreure text a Excel

    A diferència de les funcions de RegExp de VBA que pot ser escrit per qualsevol usuari d'Excel, .NET RegEx és el regne del desenvolupador. El Microsoft .NET Framework admet la sintaxi d'expressions regulars amb totes les funcions compatible amb Perl 5. Aquest article no us ensenyarà com escriure aquestes funcions (no sóc programador i no tinc ni la més mínima idea de com fer-ho :)

    Quatre potents funcions processades pel motor estàndard .NET RegEx ja estan escrites pels nostres desenvolupadors i incloses a Ultimate Suite. A continuació, mostrarem alguns usos pràctics de la funció especialment dissenyada per extreure text a Excel.

    Consell. Per obtenir informació sobre la sintaxi de .NET Regex, consulteu el Llenguatge d'expressió regular .NET.

    Com extreure'ls a l'Excel mitjançant expressions regulars

    Suposant que teniu instal·lada la darrera versió d'Ultimate Suite, extreure text mitjançant expressions regulars es redueix a aquests dos passos:

    1. A la pestanya Dades d'Ablebits , al grup Text , feu clic a Eines Regex .
    2. A la subfinestra Eines Regex , seleccioneu les dades d'origen, introduïu el vostre patró d'expressió regular i trieu l'opció Extreu . Per obtenir el resultat com a funció personalitzada, no com a valor, seleccioneu la comprovació Insereix com a fórmula Caixa. Quan hagis acabat, fes clic al botó Extreu .

    Els resultats apareixeran en una nova columna a la dreta de les dades originals:

    Sintaxi AblebitsRegexExtract

    La nostra funció personalitzada té la sintaxi següent:

    AblebitsRegexExtract(referència, expressió_regular)

    On:

    • Referència (obligatori): una referència a la cel·la que conté la cadena d'origen.
    • Expressió_regular (obligatori): el patró d'expressió regular que coincideix.

    Nota important! La funció només funciona a les màquines amb Ultimate Suite for Excel instal·lada.

    Notes d'ús

    Per fer que la vostra corba d'aprenentatge sigui més fluida i la vostra experiència més agradable, presteu atenció a aquests punts:

    1. Per crear una fórmula, podeu utilitzar les nostres Eines d'expressió regular o el diàleg Insereix funció d'Excel, o bé escriure el nom complet de la funció en una cel·la. Un cop inserida la fórmula, podeu gestionar-la (editar, copiar o moure) com qualsevol fórmula nativa.
    2. El patró que introduïu a la subfinestra Eines Regex passa al segon argument. També és possible mantenir una expressió regular en una cel·la separada. En aquest cas, només cal que utilitzeu una referència de cel·la per al segon argument.
    3. La funció extreu la primera coincidència trobada .
    4. Per defecte, la funció és cas. -sensible . Per a la concordança que no distingeix entre majúscules i minúscules, utilitzeu el patró (?i).
    5. Si no es troba cap coincidència, es mostra un error #N/A.retornat.

    Regex per extreure cadenes entre dos caràcters

    Per obtenir text entre dos caràcters, podeu utilitzar un grup de captura o mirar al voltant.

    Anem a diguem que voleu extreure text entre claudàtors. Un grup de captura és la manera més senzilla.

    Patró 1 : \[(.*?)\]

    Amb una mirada positiva enrere i endavant, el resultat serà exactament el mateix.

    Patró 2 : (?<=\[)(.*?)(?=\])

    Presteu atenció que el nostre grup de captura (.*?) fa una cerca mandrosa de text entre dos claudàtors, des del primer [ al primer ]. Un grup de captura sense un signe d'interrogació (.*) faria una cerca cobdiciosa i capturaria tot des del primer [ fins a l'últim ].

    Amb el patró a A2, la fórmula és com segueix:

    =AblebitsRegexExtract(A5, $A$2)

    Com obtenir totes les coincidències

    Com ja s'ha esmentat, la funció AblebitsRegexExtract només pot extreure una coincidència. Per obtenir totes les coincidències, podeu utilitzar la funció VBA que hem comentat anteriorment. Tanmateix, hi ha una advertència: VBA RegExp no admet la captura de grups, de manera que el patró anterior també retornarà els caràcters "límits", entre claudàtors en el nostre cas.

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

    Per desfer-se'n. dels claudàtors, SUBSTITUÏ-los amb cadenes buides ("") utilitzant aquesta fórmula:

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

    Per a una millor llegibilitat, estem utilitzant una coma per al delimitador.

    Regex per extreure text entre dues cadenes

    L'enfocament que hem treballatinterpreta-ho literalment).

  • (?:[A-Za-z\d\-\.]{2,255}\.)? - grup sense captura per identificar dominis de tercer, quart nivell, etc., si n'hi ha ( mòbil al nostre URL de mostra). En el primer patró, es col·loca dins d'un grup de captura més gran per incloure tots aquests subdominis a l'extracció. Un subdomini pot tenir entre 2 i 255 caràcters, d'aquí el quantificador {2.255}.
  • ([A-Za-z\d\-]{1,63}\.[A-Za-z] {2,24}): grup de captura per extreure el domini de segon nivell ( ablebits ) i el domini de primer nivell ( com ). La longitud màxima d'un domini de segon nivell és de 63 caràcters. El domini de nivell superior més llarg que existeix actualment conté 24 caràcters.
  • Depenent de quina expressió regular s'introdueixi a A2, la fórmula següent produirà resultats diferents:

    =AblebitsRegexExtract(A5, $A$2)

    Regex per extreure el nom complet del domini amb tots els subdominis:

    Regex per extreure un segon nivell domini sense subdominis:

    Així és com extreure parts de text a Excel mitjançant expressions regulars. Us agraeixo la lectura i espero veure-us al nostre bloc la setmana vinent!

    Descàrregues disponibles

    Exemples d'extracte d'Excel Regex (fitxer .xlsm)

    Versió de prova d'Ultimate Suite (fitxer .exe)

    \b(0?[0-9]matchs.Count - 1 text_matches(matches_index, 0) = matchs.Item (matches_index) Següent matchs_index RegExpExtract = text_matches Else RegExpExtract = matchs.Item(instance_num - 1) End If End If Exit Function ErrHandl: RegExpExpExtract = CVErrValxl

    Si teniu poca experiència amb VBA, pot ser útil una guia d'usuari pas a pas: Com inserir codi VBA a Excel.

    Nota. Perquè la funció funcioni, assegureu-vos de desar el fitxer com a llibre de treball amb macro (.xlsm).

    Sintaxi RegExpExtract

    La funció RegExpExtract cerca en una cadena d'entrada els valors que coincideixin amb una expressió regular i n'extreu una o totes.

    La funció té la sintaxi següent. :

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

    On:

    • Text (obligatori): la cadena de text per cercar.
    • Patró (obligatori): l'expressió regular que coincideix. Quan s'ofereix directament en una fórmula, el patró s'ha d'incloure entre cometes dobles.
    • Instance_num (opcional): un número de sèrie que indica quina instància cal extreure. Si s'omet, retorna totes les coincidències trobades (per defecte).
    • Match_case (opcional): defineix si s'ha de fer coincidir o ignorar el text. Si és TRUE o s'omet (per defecte), es realitza una concordança que distingeix entre majúscules i minúscules; si FALSE: no distingeix entre majúscules i minúscules.

    La funció funciona en totes les versions d'Excel 365, Excel 2021, Excel2019, Excel 2016, Excel 2013 i Excel 2010.

    4 coses que hauríeu de saber sobre RegExpExtract

    Per utilitzar la funció de manera eficaç al vostre Excel, cal tenir en compte algunes coses importants:

    1. Per defecte, la funció retorna totes les coincidències trobades a les cel·les veïnes com es mostra en aquest exemple. Per obtenir una ocurrència específica, proporcioneu un número corresponent a l'argument núm_instància .
    2. Per defecte, la funció és distingeix entre majúscules i minúscules . Per a la concordança que no distingeix entre majúscules i minúscules, establiu l'argument match_case a FALSE. A causa de les limitacions de VBA, la construcció que no distingeix entre majúscules i minúscules (?i) no funcionarà.
    3. Si no es troba un patró vàlid , la funció no retorna res (cadena buida).
    4. Si el patró no és vàlid , un #VALOR! es produeix un error.

    Abans de començar a utilitzar aquesta funció personalitzada als vostres fulls de treball, heu d'entendre de què és capaç, oi? Els exemples següents cobreixen alguns casos d'ús habituals i expliquen per què el comportament pot diferir a Dynamic Array Excel (Microsoft 365 i Excel 2021) i Excel tradicional (2019 i versions anteriors).

    Nota. Els exemples de regex estan escrits per a conjunts de dades senzills. No podem garantir que funcionin perfectament als vostres fulls de treball reals. Aquells que tinguin experiència amb regex estarien d'acord que escriure expressions regulars és un camí inacabable cap a la perfecció; gairebé sempre hi ha una manera de fer-ho.és més elegant o capaç de gestionar una gamma més àmplia de dades d'entrada.

    Regex per extreure el nombre de la cadena

    Seguint la màxima bàsica d'ensenyar "de simple a complex", començarem amb un cas molt clar: extreure nombre de cadena.

    El El primer que heu de decidir és quin número recuperar: primer, darrer, aparició específica o tots els números.

    Extreu el primer número

    Això és tan senzill com pot obtenir l'expressió regular. Atès que \d significa qualsevol dígit del 0 al 9, i + significa una o més vegades, la nostra expressió regular pren aquesta forma:

    Patró : \d+

    Conjunt instance_num a 1 i obtindreu el resultat desitjat:

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

    On A5 és la cadena original.

    Per comoditat, podeu introduir el patró en una cel·la predefinida ($A$2 ) i bloqueja la seva adreça amb el signe $:

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

    Obtenir l'últim número

    Per extreure l'últim número d'una cadena , aquí teniu el patró a utilitzar:

    Patró : (\d+)(?!.*\d)

    Traduït a un idioma humà , diu: cerca un número que no sigui seguit (enlloc, no només immediatament) per cap altre número. Per expressar-ho, estem utilitzant una mirada cap endavant negativa (?!.*\d), el que significa que a la dreta del patró no hi hauria d'haver cap altre dígit (\d), independentment de quants altres caràcters hi hagi abans.

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

    Consells:

    • Per obtenir una ocurrència específica , utilitzeu \d+ per a patró i una sèrie adequadanúmero per a número_instància .
    • La fórmula per extreure tots els números es tracta a l'exemple següent.

    Extreu regularment per extreure totes les coincidències

    Ampliant el nostre exemple una mica més enllà, suposem que voleu obtenir tots els números d'una cadena, no només un.

    Com recordareu, el nombre de coincidències extretes està controlat per l'opció argument_número_instància . El valor predeterminat és totes les coincidències, de manera que simplement ometeu aquest paràmetre:

    =RegExpExtract(A2, "\d+")

    La fórmula funciona molt bé per a una sola cel·la, però el comportament és diferent a les versions d'Excel de matriu dinàmica i no dinàmiques.

    Excel 365 i Excel 2021

    A causa de la compatibilitat amb matrius dinàmiques, una fórmula normal s'aboca automàticament a tantes cel·les com sigui necessari per mostrar tots els resultats calculats. En termes d'Excel, això s'anomena interval vessat:

    Excel 2019 i inferior

    En Excel predinàmic, la fórmula anterior només retornaria una coincidència. Per obtenir diverses coincidències, cal que sigui una fórmula matricial. Per a això, seleccioneu un rang de cel·les, escriviu la fórmula i premeu Ctrl + Maj + Retorn per completar-lo.

    Un inconvenient d'aquest enfocament és un munt d'errors #N/A que apareixen a les "cel·les addicionals". . Malauradament, no es pot fer res al respecte (ni IFERROR ni IFNA ho poden arreglar, per desgràcia).

    Extreu totes les coincidències d'una cel·la

    Quan processeu una columna de dades, l'enfocament anterior, òbviament, no funcionarà. En aquest cas, una solució idealtornaria totes les coincidències en una sola cel·la. Per fer-ho, publiqueu els resultats de RegExpExtract a la funció TEXTJOIN i separeu-los amb qualsevol delimitador que vulgueu, per exemple, una coma i un espai:

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

    Nota. Com que la funció TEXTJOIN només està disponible a Excel per a Microsoft 365, Excel 2021 i Excel 2019, la fórmula no funcionarà en versions anteriors.

    Extreure text de la cadena

    Extreure text de una cadena alfanumèrica és una tasca bastant difícil a Excel. Amb regex, es fa tan fàcil com un pastís. Només cal que utilitzeu una classe negada per fer coincidir tot el que no sigui un dígit.

    Patró : [^\d]+

    Per obtenir subcadenes en cel·les individuals (interval de vessament) , la fórmula és:

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

    Per mostrar totes les coincidències en una cel·la, niu la funció RegExpExtract a TEXTJOIN com aquesta:

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

    Regex a extreu l'adreça de correu electrònic de la cadena

    Per extreure una adreça de correu electrònic d'una cadena que conté molta informació diferent, escriviu una expressió regular que repliqui l'estructura de l'adreça de correu electrònic.

    Patró : [\w\.\-]+@[A-Za-z0-9\.\-]+\.[A-Za-z]{2,24}

    Desglossament d'aquesta expressió regular , això és el que obtenim:

    • [\w\.\-]+ és un nom d'usuari que pot incloure 1 o més caràcters alfanumèrics, guions baixos, punts i guions.
    • Símbol @
    • [A-Za-z0-9\.\-]+ és un nom de domini format per: lletres majúscules i minúscules, dígits, guions i punts (en cas quede subdominis). Els guions baixos no es permeten aquí, per tant, s'utilitzen 3 jocs de caràcters diferents (com ara A-Z a-z i 0-9) en lloc de \w que coincideix amb qualsevol lletra, dígit o guió baix.
    • \.[A-Za-z ]{2,24} és un domini de primer nivell. Consisteix en un punt seguit de lletres majúscules i minúscules. La majoria dels dominis de primer nivell tenen 3 lletres (p. ex. .com .org, .edu, etc.), però en teoria pot contenir de 2 a 24 lletres (el TLD registrat més llarg).

    Suposant que la cadena es troba a A5 i el patró a A2, la fórmula per extreure una adreça de correu electrònic és:

    =RegExpExtract(A5, $A$2)

    Regex per extreure el domini del correu electrònic

    Quan Per extreure domini de correu electrònic, el primer pensament que em ve al cap és utilitzar un grup de captura per trobar text que segueixi immediatament el caràcter @.

    Patró : @([A-Za-z0 -9\.\-]+\.[A-Za-z]{2,24})

    Serveix-ho a la nostra funció RegExp:

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

    I obtindreu aquest resultat:

    Amb les expressions regulars clàssiques, qualsevol cosa fora d'un grup de captura no s'inclou a l'extracció. Ningú sap per què VBA RegEx funciona de manera diferent i també captura "@". Per desfer-se'n, podeu eliminar el primer caràcter del resultat substituint-lo per una cadena buida.

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

    Expressió regular per extreure números de telèfon

    Números de telèfon es pot escriure de moltes maneres diferents, per la qual cosa és gairebé impossible trobar una solució que funcioni per a tots(\d{4}from string

    Una expressió regular per extreure una data depèn del format en què apareix la data dins d'una cadena. Per exemple:

    Per extreure dates com l'1/1/21 o l'01/01/2021, l'expressió regular és: \d{1,2}\/\d{1,2}\/(\d {4}circumstàncies. No obstant això, podeu anotar tots els formats utilitzats al vostre conjunt de dades i intentar fer-los coincidir.

    Per a aquest exemple, crearem una expressió regular que extreu números de telèfon en qualsevol d'aquests formats:

    (123) 345-6789

    (123) 345 6789

    (123)3456789

    123- 345-6789

    123.345.6789

    123 345 6789

    1233456789

    Patró : \(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b

    • La primera part \(?\d{3} coincideix amb zero o un parèntesi inicial seguit de tres dígits d{3}.
    • La part [-\. \)]* significa qualsevol caràcter entre claudàtors que apareix 0 o més vegades: guionet, punt, espai o parèntesis de tancament.
    • A continuació, tornem a tenir tres dígits d{3} seguits de qualsevol guionet, punt o espai [-\. ]? apareix 0 o 1 vegada.
    • Després d'això, hi ha un grup de quatre dígits \d{4}.
    • Finalment, hi ha un límit de paraula \b que defineix que un número de telèfon som cercar no pot formar part d'un nombre més gran.

    La fórmula completa pren aquesta forma:

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

    Tingueu en compte que l'expressió regular anterior pot tornar algunes resultats falsos positius com ara 123) 456 7899 o (123 456 7899. La versió següent soluciona aquests problemes. Tanmateix, aquesta sintaxi només funciona a les funcions de VBA RegExp, no a les expressions regulars clàssiques).

    Patró. : (\(\d{3}\)out per extreure text entre dos caràcters també funcionarà per extreure text entre dues cadenes.

    Per exemple, per obtenir tot entre "test 1" i "test 2", utilitzeu l'expressió regular següent.

    Patró : prova 1(.*?)prova 2

    La fórmula completa és:

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

    Extreu regex per extreure domini de l'URL

    Fins i tot amb expressions regulars, extreure noms de domini dels URL no és una tasca trivial. L'element clau que fa el truc és no capturar grups. En funció del vostre objectiu final, trieu una de les execucions regulars següents.

    Per obtenir un nom de domini complet inclosos els subdominis

    Patró : (?: https?\:

    Michael Brown és un entusiasta de la tecnologia dedicat amb una passió per simplificar processos complexos mitjançant eines de programari. Amb més d'una dècada d'experiència en la indústria tecnològica, ha perfeccionat les seves habilitats en Microsoft Excel i Outlook, així com en Google Sheets i Docs. El bloc de Michael es dedica a compartir els seus coneixements i experiència amb altres persones, oferint consells i tutorials fàcils de seguir per millorar la productivitat i l'eficiència. Tant si sou un professional experimentat com si sou un principiant, el bloc de Michael ofereix valuoses idees i consells pràctics per treure el màxim profit d'aquestes eines de programari essencials.