Táboa de contidos
Neste titorial, aprenderás a usar expresións regulares en Excel para buscar e extraer subcadeas que coincidan cun patrón determinado.
Microsoft Excel ofrece unha serie de funcións para extraer texto. das células. Esas funcións poden facer fronte á maioría dos retos de extracción de cadeas nas túas follas de traballo. A maioría, pero non todos. Cando as funcións Texto tropezan, as expresións regulares veñen rescatar. Agarda... Excel non ten funcións RegEx! É certo, non hai funcións integradas. Pero non hai nada que che impida usar as túas propias :)
Función de regex de Excel VBA para extraer cadeas
Para engadir unha función de extracción de regex personalizada ao teu Excel, pega o seguinte código no editor de VBA. Para habilitar expresións regulares en VBA, estamos a usar o obxecto Microsoft RegExp incorporado.
Función pública 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 matchs_index As Integer On Error GoTo ErrHandl RegExpExtract = "" Establecer regex = CreateObject ( "VBScript.RegExp") regex.pattern = patrón regex.Global = True regex.MultiLine = True If True = match_case Entón regex. ignorecase = False 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, anímoche a que leas a seguinte parte que analiza funcións regex .NET moito máis potentes.Función RegEx personalizada baseada en .NET para extraer texto en Excel
A diferenza das funcións RegEx VBA que pode ser escrito por calquera usuario de Excel, .NET RegEx é o reino do programador. O Microsoft .NET Framework admite a sintaxe de expresións regulares con todas as funcións compatible con Perl 5. Este artigo non che ensinará como escribir tales funcións (non son programador e non teño a máis mínima idea de como facelo :)
Catro poderosas funcións procesadas polo motor estándar .NET RegEx xa están escritas polos nosos desenvolvedores e incluídas en Ultimate Suite. A continuación, demostraremos algúns usos prácticos da función deseñada especialmente para extraer texto en Excel.
Consello. Para obter información sobre a sintaxe .NET Regex, consulte a Linguaxe de expresións regulares .NET.
Como extraer picaduras en Excel usando expresións regulares
Supoñendo que tes instalada a última versión de Ultimate Suite, extraer texto usando expresións regulares redúcese a estes dous pasos:
- Na pestana Datos de Ablebits , no grupo Texto , faga clic en Ferramentas Regex .
- No panel Ferramentas Regex , seleccione os datos de orixe, introduza o seu patrón de regex e escolla a opción Extraer . Para obter o resultado como función personalizada, non como valor, seleccione a verificación Inserir como fórmula caixa. Cando remate, fai clic no botón Extraer .
Os resultados aparecerán nunha nova columna á dereita dos teus datos orixinais:
Sintaxe AblebitsRegexExtract
A nosa función personalizada ten a seguinte sintaxe:
AblebitsRegexExtract(referencia, expresión_regular)Onde:
- Referencia (obrigatorio): unha referencia á cela que contén a cadea de orixe.
- Expresión_regular (obrigatorio): o patrón de expresións regex que coincide.
Nota importante! A función só funciona nas máquinas con Ultimate Suite for Excel instalado.
Notas de uso
Para que a túa curva de aprendizaxe sexa máis fluida e a túa experiencia máis agradable, presta atención a estes puntos:
- Para crear unha fórmula, pode usar as nosas Ferramentas de expresión regular ou o diálogo Inserir función de Excel, ou escribir o nome completo da función nunha cela. Unha vez inserida a fórmula, pode xestionala (editar, copiar ou mover) como calquera fórmula nativa.
- O padrón que introduza no panel Ferramentas Regex vai ao segundo argumento. Tamén é posible manter unha expresión regular nunha cela separada. Neste caso, só tes que usar unha referencia de cela para o segundo argumento.
- A función extrae a primeira coincidencia atopada .
- Por defecto, a función é maiúsculas e minúsculas. -sensible . Para a coincidencia que non distingue entre maiúsculas e minúsculas, use o patrón (?i).
- Se non se atopa unha coincidencia, aparecerá un erro #N/A.devolto.
Extracción regular para extraer cadeas entre dous caracteres
Para obter texto entre dous caracteres, podes usar un grupo de captura ou buscar ao redor.
Imos digamos que busca extraer texto entre corchetes. Un grupo de captura é o xeito máis sinxelo.
Patrón 1 : \[(.*?)\]
Cunha vista atrás e cara adiante positivas, o resultado será exactamente o mesmo.
Patrón 2 : (?<=\[)(.*?)(?=\])
Por favor, preste atención a que o noso grupo de captura (.*?) realiza unha busca preguiceira de texto entre dous corchetes, dende o primeiro [ ata o primeiro ]. Un grupo de captura sen signo de interrogación (.*) faría unha busca codiciosa e capturaría todo desde o primeiro [ ata o último ].
Co patrón en A2, a fórmula é como segue:
=AblebitsRegexExtract(A5, $A$2)
Como obter todas as coincidencias
Como xa se mencionou, a función AblebitsRegexExtract só pode extraer unha coincidencia. Para obter todas as coincidencias, podes usar a función VBA que comentamos anteriormente. Non obstante, hai unha advertencia: VBA RegExp non admite a captura de grupos, polo que o patrón anterior devolverá tamén os caracteres de "límite", corchetes no noso caso.
=TEXTJOIN(" ", TRUE, RegExpExtract(A5, $A$2))
Para desfacerse dos corchetes, SUBSTÍTÚEOS con cadeas baleiras ("") usando esta fórmula:
=SUBSTITUTE(SUBSTITUTE(TEXTJOIN(", ", TRUE, RegExpExtract(A5, $A$2)), "]", ""),"[","")
Para unha mellor lexibilidade, estamos a usar unha coma para o delimitador.
Regex para extraer texto entre dúas cadeas
O enfoque que traballamosinterpretalo literalmente).
En función da expresión regular que se introduza en A2, a seguinte fórmula producirá resultados diferentes:
=AblebitsRegexExtract(A5, $A$2)
Regex para extraer o nome de dominio completo con todos os subdominios:
Regex para extraer un segundo nivel dominio sen subdominios:
Así é como extraer partes de texto en Excel usando expresións regulares. Grazas por ler e espero verte no noso blog a vindeira semana!
Descargas dispoñibles
Exemplos de extractos regex de Excel (ficheiro .xlsm)
Versión de proba de Ultimate Suite (ficheiro .exe)
\b(0?[0-9]matchs.Count - 1 text_matches(matches_index, 0) = matchs.Item (matches_index) Seguinte matchs_index RegExpExtract = text_matches Else RegExpExtract = matchs.Item(instance_num - 1) End If End If Exit Función ErrHandl: RegExpExpExtract = CVErrValxlSe tes pouca experiencia con VBA, pode resultar útil unha guía de usuario paso a paso: Como inserir código VBA en Excel.
Nota. Para que a función funcione, asegúrate de gardar o teu ficheiro como caderno de traballo habilitado para macro (.xlsm).
Sintaxe RegExpExtract
A función RegExpExtract busca nunha cadea de entrada valores que coincidan cunha expresión regular e extrae unha ou todas as coincidencias.
A función ten a seguinte sintaxe. :
RegExpExtract(texto, patrón, [número_instance], [match_case])Onde:
- Texto (obrigatorio): a cadea de texto na que se buscar.
- Patrón (obrigatorio): a expresión regular que se debe coincidir. Cando se proporciona directamente nunha fórmula, o patrón debe ir entre comiñas dobres.
- Número_instancia (opcional): un número de serie que indica a instancia que se vai extraer. Se se omite, devolve todas as coincidencias atopadas (predeterminado).
- Match_case (opcional) - define se hai que coincidir ou ignorar o texto. Se é VERDADEIRO ou se omite (predeterminado), realízase a correspondencia entre maiúsculas e minúsculas; se FALSO: non distingue entre maiúsculas e minúsculas.
A función funciona en todas as versións de Excel 365, Excel 2021, Excel2019, Excel 2016, Excel 2013 e Excel 2010.
4 cousas que debes saber sobre RegExpExtract
Para usar eficazmente a función no teu Excel, hai algunhas cousas importantes que debes ter en conta:
- Por defecto, a función devolve todas as coincidencias atopadas nas celas veciñas como se mostra neste exemplo. Para obter unha ocorrencia específica, proporcione un número correspondente ao argumento número_instancia .
- Por defecto, a función é distingue entre maiúsculas e minúsculas . Para a coincidencia que non distingue entre maiúsculas e minúsculas, establece o argumento match_case en FALSE. Debido ás limitacións de VBA, a construción que non distingue entre maiúsculas e minúsculas (?i) non funcionará.
- Se non se atopa un patrón válido , a función non devolve nada (cadea baleira).
- Se o patrón non é válido , un #VALOR! ocorre un erro.
Antes de comezar a usar esta función personalizada nas túas follas de traballo, cómpre comprender de que é capaz, non? Os exemplos seguintes cobren algúns casos de uso comúns e explican por que o comportamento pode diferir en Dynamic Array Excel (Microsoft 365 e Excel 2021) e Excel tradicional (2019 e versións anteriores).
Nota. Os exemplos de expresións regulares están escritos para conxuntos de datos simples. Non podemos garantir que funcionarán perfectamente nas túas follas de traballo reais. Aqueles que teñan experiencia con expresións regulares estarían de acordo en que escribir expresións regulares é un camiño interminable cara á perfección; case sempre hai unha forma de faceré máis elegante ou capaz de manexar unha gama máis ampla de datos de entrada.
Rexex para extraer número da cadea
Seguindo a máxima básica de ensinar "de simple a complexo", comezaremos cun caso moi sinxelo: extraer número da cadea.
O O primeiro que debes decidir é que número recuperar: primeiro, último, ocorrencia específica ou todos os números.
Extraer o primeiro número
Isto é tan sinxelo como pode obter expresións regulares. Dado que \d significa calquera díxito de 0 a 9 e + significa unha ou máis veces, a nosa expresión regular toma esta forma:
Patrón : \d+
Establecer número_instance a 1 e obterás o resultado desexado:
=RegExpExtract(A5, "\d+", 1)
Onde A5 é a cadea orixinal.
Para maior comodidade, podes introducir o patrón nunha cela predefinida ($A$2 ) e bloquea o seu enderezo co signo $:
=RegExpExtract(A5, $A$2, 1)
Obter o último número
Para extraer o último número dunha cadea , aquí está o patrón a usar:
Patrón : (\d+)(?!.*\d)
Traducido a unha lingua humana , di: atopar un número que non vai seguido (en ningún lugar, non só inmediatamente) por ningún outro número. Para expresar isto, estamos a usar un lookahead negativo (?!.*\d), o que significa que á dereita do patrón non debería haber outro díxito (\d) independentemente de cantos caracteres estean antes.
=RegExpExtract(A5, "(\d+)(?!.*\d)")
Consellos:
- Para obter unha ocurrencia específica , use \d+ para o patrón e unha serie adecuadanúmero para número_instance .
- A fórmula para extraer todos os números explícase no seguinte exemplo.
Rexex para extraer todas as coincidencias
Empuxando un pouco máis o noso exemplo, supoña que quere obter todos os números dunha cadea, non só unha.
Como lembrará, o número de coincidencias extraídas está controlada pola opción <1 Argumento>número_instancia . O valor predeterminado son todas as coincidencias, polo que simplemente omites este parámetro:
=RegExpExtract(A2, "\d+")
A fórmula funciona moi ben para unha única cela, pero o comportamento é diferente en Dynamic Array Excel e versións non dinámicas.
Excel 365 e Excel 2021
Debido á compatibilidade con matrices dinámicas, unha fórmula normal verte automaticamente en tantas celas como sexa necesario para mostrar todos os resultados calculados. En termos de Excel, isto denomínase intervalo derramado:
Excel 2019 e inferior
En Excel predinámico, a fórmula anterior devolvería só unha coincidencia. Para obter varias coincidencias, cómpre que sexa unha fórmula matricial. Para iso, seleccione un intervalo de celas, escriba a fórmula e prema Ctrl + Maiús + Intro para completalo.
Un inconveniente deste enfoque é unha morea de erros #N/A que aparecen nas "celdas adicionais" . Lamentablemente, non se pode facer nada ao respecto (nin IFERROR nin IFNA poden solucionalo, por desgraza).
Extrae todas as coincidencias nunha cela
Ao procesar unha columna de datos, o enfoque anterior obviamente non funcionará. Neste caso, unha solución idealestaría devolvendo todas as coincidencias nunha única cela. Para facelo, envía os resultados de RegExpExtract á función TEXTJOIN e sepáraos con calquera delimitador que desexe, digamos unha coma e un espazo:
=TEXTJOIN(", ", TRUE, RegExpExtract(A5, "\d+"))
Nota. Dado que a función TEXTJOIN só está dispoñible en Excel para Microsoft 365, Excel 2021 e Excel 2019, a fórmula non funcionará en versións anteriores.
Extraer texto regular da cadea
Extraer texto de unha cadea alfanumérica é unha tarefa bastante desafiante en Excel. Con regex, faise tan sinxelo coma unha torta. Simplemente use unha clase negada para facer coincidir todo o que non sexa un díxito.
Patrón : [^\d]+
Para obter subcadeas en celas individuais (intervalo de derrame) , a fórmula é:
=RegExpExtract(A5, "[^\d]+")
Para emitir todas as coincidencias nunha cela, aniñe a función RegExpExtract en TEXTJOIN así:
=TEXTJOIN("", TRUE, RegExpExtract(A5, "[^\d]+"))
Regex para extraer o enderezo de correo electrónico da cadea
Para extraer un enderezo de correo electrónico dunha cadea que contén moita información diferente, escribe unha expresión regular que replique a estrutura do enderezo de correo electrónico.
Patrón : [\w\.\-]+@[A-Za-z0-9\.\-]+\.[A-Za-z]{2,24}
Desglosando esta expresión regular , isto é o que obtemos:
- [\w\.\-]+ é un nome de usuario que pode incluír 1 ou máis caracteres alfanuméricos, guións baixos, puntos e guións.
- Símbolo @
- [A-Za-z0-9\.\-]+ é un nome de dominio composto por: letras maiúsculas e minúsculas, díxitos, guións e puntos (en caso dede subdominios). Aquí non se permiten guións baixos, polo que úsanse 3 conxuntos de caracteres diferentes (como A-Z a-z e 0-9) en lugar de \w que coincida con calquera letra, díxito ou guión baixo.
- \.[A-Za-z ]{2,24} é un dominio de nivel superior. Consta dun punto seguido de letras maiúsculas e minúsculas. A maioría dos dominios de primeiro nivel teñen 3 letras (por exemplo, .com .org, .edu, etc.), pero en teoría pode conter de 2 a 24 letras (o TLD rexistrado máis longo).
Asumindo que a cadea está en A5 e o patrón en A2, a fórmula para extraer un enderezo de correo electrónico é:
=RegExpExtract(A5, $A$2)
Regex para extraer o dominio do correo electrónico
Cando se trata de extraer o dominio de correo electrónico, o primeiro que se me ocorre é usar un grupo de captura para atopar texto que segue inmediatamente ao carácter @.
Patrón : @([A-Za-z0 -9\.\-]+\.[A-Za-z]{2,24})
Sírvao á nosa función RegExp:
=RegExpExtract(A5, "@([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})")
E obterás este resultado:
Coas expresións regulares clásicas, calquera cousa fóra dun grupo de captura non se inclúe na extracción. Ninguén sabe por que VBA RegEx funciona de forma diferente e tamén captura "@". Para desfacerse del, podes eliminar o primeiro carácter do resultado substituíndoo por unha cadea baleira.
=REPLACE(RegExpExtract(A5, "@([a-z\d][a-z\d\-\.]*\.[a-z]{2,})", 1, FALSE), 1, 1, "")
Expresión regular para extraer números de teléfono
Números de teléfono pódese escribir de moitas formas diferentes, polo que é case imposible atopar unha solución que funcione para todos(\d{4}from string
Unha expresión regular para extraer unha data depende do formato no que a data aparece dentro dunha cadea. Por exemplo:
Para extraer datas como o 1/1/21 ou o 01/01/2021, a expresión regular é: \d{1,2}\/\d{1,2}\/(\d {4}circunstancias. Non obstante, pode anotar todos os formatos utilizados no seu conxunto de datos e tentar combinalos.
Para este exemplo, imos crear unha expresión regular que extraerá números de teléfono en calquera destes formatos:
(123) 345-6789 (123) 345 6789 (123)3456789 123- 345-6789 | 123.345.6789 123 345 6789 1233456789 |
Patrón : \(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b
- A primeira parte \(?\d{3} coincide con cero ou un paréntese inicial seguido de tres díxitos d{3}.
- A parte [-\. \)]* significa calquera carácter entre corchetes que aparece 0 ou máis veces: guión, punto, espazo ou paréntese de peche.
- A continuación, temos tres díxitos de novo d{3} seguido de calquera guión, punto ou espazo [-\. ]? aparece 0 ou 1 vez.
- Despois diso, hai un grupo de catro díxitos \d{4}.
- Por último, hai un límite de palabras \b que define que un número de teléfono somos a busca non pode formar parte dun número maior.
A fórmula completa toma esta forma:
=RegExpExtract(A5, "\(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b")
Ten en conta que a expresión regular anterior pode devolver algunhas resultados falsos positivos, como 123) 456 7899 ou (123 456 7899. A seguinte versión soluciona estes problemas. Non obstante, esta sintaxe só funciona nas funcións VBA RegExp, non nas expresións regulares clásicas.
Patrón. : (\(\d{3}\)para extraer texto entre dous caracteres tamén funcionará para extraer texto entre dúas cadeas.
Por exemplo, para obter todo entre "test 1" e "test 2", use a seguinte expresión regular.
Patrón : proba 1(.*?)test 2
A fórmula completa é:
=AblebitsRegexExtract(A5, "test 1(.*?)test 2")
Rexex para extraer dominio do URL
Aínda con expresións regulares, extraer nomes de dominio dos URL non é unha tarefa trivial. O elemento clave que fai o truco é a non captura de grupos. Dependendo do teu obxectivo final, escolla unha das seguintes expresións regulares.
Para obter un nome de dominio completo incluíndo subdominios
Patrón : (?: https?\: