Táboa de contidos
Neste titorial, teremos unha ollada en profundidade sobre como usar regex para facer coincidir cadeas en Excel.
Cando necesites atopar un determinado valor nun intervalo de celas, usarías a función MATCH ou XMATCH. Cando se busca unha cadea específica nunha cela, as funcións FIND e SEARCH son útiles. E como sabes se unha cela contén información que coincide cun patrón determinado? Obviamente, usando expresións regulares. Pero, fóra da caixa, Excel non admite regexes. Non te preocupes, forzarémolo a :)
Función Excel VBA Regex para que coincida con cadeas
Como queda bastante claro desde o título, para usar expresións regulares en Excel, debes crear a túa propia función. Afortunadamente, o VBA de Excel ten un obxecto RegExp incorporado, que podes usar no teu código como se mostra a continuación:
Función pública RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'matriz para almacenar os resultados Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long' índice da fila actual no rango de orixe, índice da columna actual no rango de orixe, reconto de filas, conta de columns En caso de erro GoTo ErrHandl RegExpMatch = arRes Establecer regex = CreateObject ( "VBScript.RegExp") regex.pattern = patrón regex.Global = True regex.MultiLine = True If True = match_case Then regex.ignorecase = False Else regex.ignorecase = True Finexpresións.Patrón : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\- ]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b
Para comprender mellor o que está a suceder aquí, vexamos cada parte máis detidamente :
- O nome de usuario pode incluír letras, números, guións baixos, puntos e guións. Tendo en conta que \w coincide con calquera letra, díxito ou guión baixo, obtemos a seguinte expresión regular: [\w\.\-]+
- O nome de dominio pode incluír letras maiúsculas e minúsculas, díxitos, guións (pero non na primeira nin na última posición) e puntos (no caso dos subdominios). Dado que non se permiten guións baixos, en lugar de \w estamos a usar 3 conxuntos de caracteres diferentes: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
- O dominio de nivel superior consta dun punto seguido de letras maiúsculas e minúsculas. Pode conter de 2 a 24 letras (o TLD máis longo que existe actualmente): \.[A-Za-z]{2,24}
Nota. O patrón supón que o nome de dominio contén 2 ou máis caracteres alfanuméricos.
Co texto orixinal en A5 e o patrón en A5, a fórmula toma esta forma:
=RegExpMatch(A5, $A$2)
Ou pode usar un estándar máis sinxelo expresión para a validación de correo electrónico con un conxunto de caracteres en minúscula ou en maiúscula:
Patrón : \b[\w\.\-]+@[a-z0-9]+[a- z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b
Pero fai que a túa fórmula non distinga entre maiúsculas e minúsculas:
=RegExpMatch(A5, $A$2, FALSE)
Fórmula de Excel IF con expresión regular de coincidencia
Debido ao feito de que está integrado e personalizadoas funcións van ben, non hai nada que impida usalas xuntas nunha única fórmula.
Para devolver ou calcular algo se unha expresión regular coincide e outra cousa se non coincide, incrusta o RegExpMatch personalizado. función no texto lóxico de IF:
IF(RegExpMatch(…), [value_if_true], [value_if_false])Por exemplo, se unha cadea en A5 contén un enderezo de correo electrónico válido, podes devolver "Si"; en caso contrario, "Non".
=IF(RegExpMatch(A5, $A$2,), "Yes", "No")
Contar se coincide a expresión regular
Debido a que as funcións nativas de Excel non admiten expresións regulares, é non é posible poñer unha expresión regular directamente na función COUNTIS ou COUNTIFS. Afortunadamente, podes emular esta funcionalidade usando a nosa función personalizada.
Supoño que usaches unha expresión regular para facer coincidir os números de teléfono e mostrar os resultados na columna B. Para saber cantas celas conteñen números de teléfono, só precisas para contar os valores VERDADEIROS en B5:B9. E iso pódese facer facilmente usando a fórmula estándar COUNTIF:
=COUNTIF(B5:B9, TRUE)
Non queres ningunha columna extra na túa folla de traballo? Sen problema. Tendo en conta que a nosa función personalizada pode procesar varias celas á vez e que a SUMA de Excel pode sumar valores nunha matriz, isto é o que fai:
- Fornece unha referencia de intervalo a RegExpMatch, polo que devolve un matriz de valores VERDADERO e FALSO.
- Use unha dobre negación (--) para forzar os valores lóxicos a uns eceros.
- Obter a función SUMA para sumar 1 e 0 na matriz resultante.
=SUM(--RegExpMatch(A5:A9, $A$2))
Coincidencia de expresións rex. con Ultimate Suite
Os usuarios da nosa Ultimate Suite poden aproveitar catro poderosas funcións Regex sen engadir ningún código VBA aos seus libros de traballo xa que se integran sen problemas en Excel durante a instalación do complemento. As nosas funcións personalizadas son procesadas polo motor estándar .NET RegEx e admiten expresións regulares clásicas con todas as funcións.
Como usar a función RegexMatch personalizada
Supoñendo que tes instalada a última versión de Ultimate Suite ( 2021.4 ou posterior), pode crear unha fórmula de coincidencia de regex en dous pasos sinxelos:
- Na pestana Datos de Ablebits , no grupo Texto , faga clic en Ferramentas rex. .
- Seleccione as cadeas de orixe.
- Introduza o seu patrón.
- Escolla a opción Coincidir .
- Para ter os resultados como fórmulas, non como valores, seleccione a opción Inserir como unha fórmula caixa de verificación.
- Fai clic no botón Coincidir .
Un momento despois, a función AblebitsRegexMatch insírese nunha nova columna á dereita dos seus datos.
Na captura de pantalla que aparece a continuación, a función comproba se as cadeas da columna A conteñen 7 díxitos. números ou non.
Consellos:
- A función Pódese inserir directamente nunha cela a través do cadro de diálogo estándar Inserir función , onde se clasifica en AblebitsUDFs .
- Por defecto, engádese unha expresión regular á fórmula, pero tamén pode manter iso nunha cela separada. Para iso, só tes que usar unha referencia de cela para o segundo argumento.
- Por defecto, a función é distingue entre maiúsculas e minúsculas . Para a correspondencia que non distingue entre maiúsculas e minúsculas, use o patrón (?i).
Para obter máis información, consulte a función AblebitsRegexMatch.
Así é como facer a coincidencia de expresións regulares en Excel. Grazas por ler e espero verte no noso blogue a vindeira semana!
Descargas dispoñibles
Exemplos de coincidencias regex de Excel (ficheiro .xlsm)
Ultimate Suite 14- Versión totalmente funcional do día (ficheiro .exe)
Se cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputRows, 1 To cntInputCols) For iInputCurRow = 1 To cntInputRows For iInputCurCol = 1 To cntInputCurCol = 1 To cntInputCurColInputs(TrCourCols) .Cells(iInputCurRow, iInputCurCol).Value) Seguinte Seguinte RegExpMatch = arRes Función de saída ErrHandl: RegExpMatch = CVErr(xlErrValue) End FunctionPega o código no editor VBA e a túa nova función RegExpMatch listo para usar. Se non tes moita experiencia con VBA, esta guía pode ser útil: Como inserir código VBA en Excel.
Nota. Despois de inserir o código, recorda gardar o teu ficheiro como caderno de traballo habilitado para macro (.xlsm).
Sintaxe RegExpMatch
A función RegExpMatch comproba se algunha parte da cadea de orixe coincide cunha expresión regular. O resultado é un valor booleano: TRUE se se atopa polo menos unha coincidencia, FALSE en caso contrario.
A nosa función personalizada ten 3 argumentos: os dous primeiros son obrigatorios e o último é opcional:
RegExpMatch(texto , patrón, [match_case])Onde:
- Texto (obrigatorio): unha ou máis cadeas para buscar. Pódese proporcionar como referencia de cela ou intervalo.
- Patrón (obrigatorio): a expresión regular que debe coincidir. Cando se coloca directamente nunha fórmula, un patrón debe estar entre comiñas dobres.
- Match_case (opcional) - define a coincidenciatipo. 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, Excel 2019, Excel 2016, Excel 2013 e Excel 2010.
3 cousas debería saber sobre RegExpMatch
Antes de chegar aos cálculos prácticos, teña en conta os seguintes puntos que aclaran algúns aspectos técnicos:
- A función pode procesar unha célula única ou intervalo de celas . Neste último caso, os resultados devólvense nas celas veciñas en forma de matriz dinámica ou intervalo de derrame, como se mostra neste exemplo.
- Por defecto, a función é distingue entre maiúsculas e minúsculas . Para ignorar maiúsculas e minúsculas, establece o argumento match_case en FALSE. Debido ás limitacións da expresión regular de VBA, non se admite o patrón que non distingue entre maiúsculas e minúsculas (?i).
- Se non se atopa un patrón válido, a función devolve FALSO; se o patrón non é válido , un #VALOR! prodúcese un erro.
A continuación, atoparás algúns exemplos de coincidencia de expresións regex que se crearon con fins de demostración. Non podemos garantir que os nosos patróns funcionen perfectamente cunha gama máis ampla de datos de entrada nas túas follas de traballo reais. Antes de poñer en produción, asegúrate de probar e axustar os nosos patróns de mostras segundo as túas necesidades.
Como usar regex para combinar cadeas en Excel
Cando todas as cadeas que queres combinar teñen o mesmo patrón,as expresións regulares son unha solución ideal.
Supoño que tes un rango de celas (A5:A9) que conteñen varios detalles sobre algúns elementos. Queres saber que celas teñen SKU. Asumindo que cada SKU consta de 2 letras maiúsculas, un guión e 3 díxitos, podes relacionalos usando a seguinte expresión.
Patrón : \b[A-Z]{2}-\ d{3}\b
Onde [A-Z]{2} significa 2 letras maiúsculas de A a Z e \d{3} significa 3 díxitos de 0 a 9. O carácter \b indica unha palabra límite, o que significa que un SKU é unha palabra separada e non parte dunha cadea máis grande como 23-MAR-2022.
Co padrón establecido, podemos pasar a escribir unha fórmula. Esencialmente, usar unha función personalizada non é diferente dunha nativa. En canto comeces a escribir unha fórmula, o nome da función aparecerá na lista suxerida polo Autocompletar de Excel. Non obstante, hai un par de matices en Dynamic Array Excel (Microsoft 365 e Excel 2021) e Excel tradicional (2019 e versións anteriores).
Coincidir cadea nunha cela
Para facer coincidir unha cadea nunha única cela, refírese a esa cela no primeiro argumento. Suponse que o segundo argumento contén unha expresión regular.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
O patrón tamén se pode manter nunha cela predefinida, que está bloqueada cunha referencia absoluta ($A$2):
=RegExpMatch(A5, $A$2)
Despois de introducir a fórmula na primeira cela, pode arrastrala cara abaixo ata todas as outras filas.
Este métodofunciona moi ben en todas as versións de Excel .
Combinar cadeas de varias celas á vez
Para combinar varias cadeas cunha única fórmula, inclúa unha referencia de intervalo no primeiro argumento:
=RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")
En Excel 365 e Excel 2021 que admiten matrices dinámicas, funciona deste xeito: escribe a fórmula na primeira cela, preme Intro e a fórmula vertese automaticamente nas celas de abaixo.
En Excel 2019 e anteriores, só funciona como unha fórmula de matriz CSE tradicional, que se introduce nun intervalo de celas e complétase premendo as teclas Ctrl + Maiúsculas + Intro xuntos.
Rex para que coincida con o número
Para facer coincidir calquera díxitos do 0 ao 9, use o carácter \d na expresión regular. Dependendo da túa tarefa en particular, engade un cuantificador axeitado ou crea un patrón máis complexo.
Rexex para que coincida con calquera número
Para que coincida con calquera número de calquera lonxitude, pon o cuantificador + xusto despois do / carácter d, que di buscar números que conteñan 1 ou máis díxitos.
Patrón : \d+
=RegExpMatch(A5:A9, "\d+")
Regex para facer coincidir un número de lonxitude específica
Se o teu obxectivo é facer coincidir valores numéricos que conteñan un determinado número de díxitos, utiliza \d xunto cun cuantificador axeitado.
Por exemplo, para facer coincidir os números de factura que constan exactamente de 7 díxitos, usarías \d{7}. Non obstante, ten en conta que coincidirá co 7como era de esperar:
Notas:
- Os códigos internacionais non están marcados, polo que poden estar presentes ou non.
- Nas expresións regulares, \s significa calquera espazo en branco como un espazo, tabulación, retorno de carro ou liña nova. Para permitir só espazos, use [-\. ] en lugar de [-\.\s].
- [^13] coincidirá con calquera carácter que non sexa 1 ou 3.
- [^1-3] coincidirá con calquera carácter que non sexa 1, 2 ou 3 (é dicir, calquera díxitos do 1 ao 3).
- A expresión regular anterior só funciona para cadeas de liña única . No caso de cadeas de miltilínea, os caracteres ^ e $ coinciden co principio e o final de cada liña en lugar do principio e o final da cadea de entrada, polo que a expresión regular só busca na primeira liña.
- Para facer coincidir cadeas que non comezan con determinado texto , use unha expresión regular como ^(?!lemons).*$
- Para facer coincidir cadeas que non rematan con determinado texto , inclúaáncora a cadea final no patrón de busca: ^((?!lemons$).)*$
Rex para NON coincidir con carácter
Para buscar cadeas que NON conteñan un determinado carácter, podes usar clases de caracteres negados [^ ] que coincidan calquera cousa que NON entre parénteses. Por exemplo:
Nunha lista de números de teléfono, supoña que quere atopar aqueles que non teñen un código de país. Tendo en conta que calquera código internacional inclúe o signo +, podes usar a clase de caracteres [^\+] para buscar cadeas que non conteñan o signo máis. É importante entender que a expresión anterior coincide con calquera carácter que non sexa +. Dado que un número de teléfono pode estar en calquera parte dunha cadea, non necesariamente ao principio, engádese o cuantificador * para comprobar cada carácter posterior. As áncoras de inicio ^ e $ finais garanten que se procese toda a cadea. Como resultado, obtemos a seguinte expresión regular que di "non coincide co carácter + en ningunha posición da cadea".
Patrón :^[^\+]*$
=RegExpMatch(A5, "^[^\+]*$")
Regex to NOT match string
Aínda que non hai unha sintaxe de expresión regular especial para non coincide cunha cadea específica, pode emular este comportamento mediante unha mirada previa negativa.
Supoño que quere atopar cadeas que non conteñan a palabra "limóns". Esta expresión regular funcionará moi ben:
Patrón : ^((?!lemons).)*$
Obviamente, aquí é necesaria algunha explicación. O lookahead negativo (?!lemons) mira cara á dereita para ver se non hai ningunha palabra "lemons" por diante. Se "lemons" non está alí, entón o punto coincide con calquera carácter excepto un salto de liña. A expresión anterior realiza só unha comprobación e o cuantificador * repíteo cero ou máis veces, desde o inicio da cadea ancorada por ^ ata o final da cadea ancorada por $.
Para ignorar o caso do texto, establecemos o 3º argumento en FALSO para que a nosa función non distinga entre maiúsculas e minúsculas:
=RegExpMatch(A5, $A$2, FALSE)
Consellos e notas:
Coincidencia insensible entre maiúsculas e minúsculas
Nas expresións regulares clásicas, hai un patrón especial para a coincidencia que non distingue entre maiúsculas e minúsculas (?i), que non é compatible con VBA RegExp. Para superar esta limitación, a nosa función personalizada acepta o terceiro argumento opcional chamado match_case . Para facer unha coincidencia insensible entre maiúsculas e minúsculas, simplemente establece-o como FALSO.
Digamos que queres identificar datas como o 1-Mar-22 ou o 01-MAR-2022. Para facer coincidir os formatos dd-mmm-yyyy e d-mmm-yy , estamos a usar a seguinte expresión regular.
Patrón : \b\d{1,2}-(xandíxitos en calquera lugar da cadea, incluído un número de 10 ou 100 díxitos. Se isto non é o que buscas, pon o límite da palabra \b nos dous lados.
Patrón : \b\d{7}\b
=RegExpMatch(A5:A9, "\b\d{7}\b")
Explicación rexional para combinar números de teléfono
Dado que os números de teléfono poden escribirse en varios formatos, para relacionalos require unha expresión regular máis sofisticada.
No seguinte conxunto de datos, buscaremos números de 10 díxitos que teñan 3 díxitos nos 2 primeiros grupos e 4 díxitos no último grupo. Os grupos pódense separar cun punto, guión ou espazo. O primeiro grupo pode estar ou non entre parénteses.
Patrón: (\(\d{3}\)