Excel Regex: búsqueda de cadenas mediante expresiones regulares

  • Compartir Este
Michael Brown

En este tutorial, veremos en profundidad cómo utilizar expresiones regulares para hacer coincidir cadenas en Excel.

Si necesita encontrar un valor determinado en un rango de celdas, utilice las funciones MATCH o XMATCH. Si busca una cadena específica en una celda, las funciones FIND y SEARCH le resultarán muy útiles. ¿Y cómo sabe si una celda contiene información que coincide con un patrón determinado? Obviamente, utilizando expresiones regulares. Pero Excel no admite expresiones regulares de fábrica. No se preocupe, le obligaremos a hacerlo :)

    Excel VBA Regex función para que coincida con las cadenas

    Como se desprende claramente del encabezamiento, para utilizar expresiones regulares en Excel, es necesario crear una función propia. Por suerte, el VBA de Excel tiene incorporada una función RegExp que puede utilizar en su código como se muestra a continuación:

    Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'matriz para almacenar los resultados Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'índice de la fila actual en el rango fuente, índice de la columna actual en el rango fuente, recuento de filas, recuento de columnas On Error GoTo ErrHandlRegExpMatch = arRes Set 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 cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputRows, 1 To cntInputCols) For iInputCurRow = 1 To cntInputRows ForiInputCurCol = 1 To cntInputCols arRes(iInputCurRow, iInputCurCol) = regex.Test(input_range.Cells(iInputCurRow, iInputCurCol).Value) Next Next RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) End Function

    Pegue el código en el editor VBA, y su nuevo RegExpMatch Si no tiene mucha experiencia con VBA, esta guía puede serle útil: Cómo insertar código VBA en Excel.

    Nota: Después de insertar el código, recuerde guardar el archivo como archivo libro de trabajo habilitado para macros (.xlsm).

    Sintaxis de RegExpMatch

    En RegExpMatch comprueba si alguna parte de la cadena fuente coincide con una expresión regular. El resultado es un valor booleano: TRUE si se encuentra al menos una coincidencia, FALSE en caso contrario.

    Nuestra función personalizada tiene 3 argumentos: los dos primeros son obligatorios y el último es opcional:

    RegExpMatch(texto, patrón, [match_case])

    Dónde:

    • Texto (obligatorio) - una o más cadenas en las que buscar. Puede suministrarse como referencia de celda o rango.
    • Patrón (obligatorio) - la expresión regular que debe coincidir. Cuando se coloca directamente en una fórmula, un patrón debe ir entre comillas dobles.
    • Caso_partido (opcional) - define el tipo de coincidencia. Si es TRUE o se omite (por defecto), se distingue entre mayúsculas y minúsculas; si es FALSE, no se distingue entre mayúsculas y minúsculas.

    La función funciona en todas las versiones de Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 y Excel 2010.

    3 cosas que debe saber sobre RegExpMatch

    Antes de pasar a los cálculos prácticos, preste atención a los siguientes puntos que aclaran algunos tecnicismos:

    1. La función puede procesar un una sola célula o rango de celdas En este último caso, los resultados se devuelven en las celdas vecinas en forma de matriz dinámica, o rango de derrames, como se muestra en este ejemplo.
    2. Por defecto, la función es distingue entre mayúsculas y minúsculas Para ignorar las mayúsculas y minúsculas, configure match_case Debido a las limitaciones de VBA Regexp, no se admite el patrón insensible a mayúsculas/minúsculas (?i).
    3. Si no se encuentra un patrón válido, la función devuelve FALSE; si el patrón el patrón no es válido se produce un error #¡VALOR!

    A continuación, encontrará algunos ejemplos de coincidencias regex creados con fines de demostración. No podemos garantizar que nuestros patrones funcionen sin problemas con una gama más amplia de datos de entrada en sus hojas de cálculo reales. Antes de ponerlos en producción, asegúrese de probar y ajustar nuestros patrones de muestra según sus necesidades.

    Cómo utilizar regex para hacer coincidir cadenas en Excel

    Cuando todas las cadenas que desea hacer coincidir tienen el mismo patrón, las expresiones regulares son una solución ideal.

    Supongamos que tiene un rango de celdas (A5:A9) que contienen varios detalles sobre algunos artículos. Desea saber qué celdas tienen SKU. Suponiendo que cada SKU consta de 2 letras mayúsculas, un guión y 3 dígitos, puede hacerlas coincidir utilizando la siguiente expresión.

    Patrón : \b[A-Z]{2}-\d{3}\b

    Donde [A-Z]{2} significa 2 letras mayúsculas cualesquiera de la A a la Z y \d{3} significa 3 dígitos cualesquiera de 0 a 9. El carácter \b denota un límite de palabra, lo que significa que una SKU es una palabra independiente y no forma parte de una cadena mayor como 23-MAR-2022.

    Con el patrón establecido, podemos pasar a escribir una fórmula. Esencialmente, usar una función personalizada no es diferente de una nativa. Tan pronto como empiece a escribir una fórmula, el nombre de la función aparecerá en la lista sugerida por Autocompletar de Excel. Sin embargo, hay un par de matices en Dynamic Array Excel (Microsoft 365 y Excel 2021) y Excel tradicional (2019 y versiones anteriores).

    Coincidir cadena en una celda

    Para hacer coincidir una cadena en una sola celda, haga referencia a esa celda en el primer argumento. Se supone que el segundo argumento contiene una expresión regular.

    =RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")

    El patrón también puede guardarse en una celda predefinida, que se bloquea con una referencia absoluta ($A$2):

    =RegExpMatch(A5, $A$2)

    Después de introducir la fórmula en la primera celda, puede arrastrarla hacia abajo a todas las demás filas.

    Este método funciona perfectamente en todas las versiones de Excel .

    Coincidir cadenas en varias celdas a la vez

    Para hacer coincidir varias cadenas con una sola fórmula, incluya una referencia de rango en el primer argumento:

    =RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")

    En Excel 365 y Excel 2021 que admiten matrices dinámicas, funciona de la siguiente manera: escribes la fórmula en la primera celda, pulsas Intro y la fórmula se extiende automáticamente a las celdas inferiores.

    En Excel 2019 y anteriores, sólo funciona como una fórmula de matriz CSE tradicional, que se introduce en un rango de celdas y se completa pulsando a la vez las teclas Ctrl + Mayús + Intro.

    Regex para que coincida con el número

    Para que coincida con cualquier dígito del 0 al 9, utilice la tecla \d Dependiendo de su tarea, añada un cuantificador adecuado o cree un patrón más complejo.

    Regex para que coincida con cualquier número

    Para que coincida con cualquier número de cualquier longitud, ponga el cuantificador + justo después del carácter /d, que dice que se busquen números que contengan 1 o más dígitos.

    Patrón : \d+

    =RegExpMatch(A5:A9, "\d+")

    Regex para que coincida con el número de longitud específica

    Si su objetivo es buscar valores numéricos que contengan un determinado número de dígitos, utilice \d junto con un cuantificador adecuado.

    Por ejemplo, para que coincida con números de factura que consten exactamente de 7 dígitos, utilizaría \d{7}. Sin embargo, tenga en cuenta que coincidirá con 7 dígitos en cualquier parte de la cadena, incluido un número de 10 ó 100 dígitos. Si esto no es lo que busca, ponga el límite de la palabra \b en ambos lados.

    Patrón : \b\d{7}\b

    =RegExpMatch(A5:A9, "\b\d{7}\b")

    Regex para emparejar números de teléfono

    Dado que los números de teléfono pueden escribirse en varios formatos, su búsqueda requiere una expresión regular más sofisticada.

    En el siguiente conjunto de datos, buscaremos números de 10 dígitos que tengan 3 dígitos en los 2 primeros grupos y 4 dígitos en el último grupo. Los grupos pueden separarse con un punto, un guión o un espacio. El primer grupo puede ir o no entre paréntesis.

    Patrón: (\(\d{3}\)

    Desglosando esta expresión regular, esto es lo que obtenemos:

    • La primera parte (\(\d{3}\)
    • La parte [-\.\s]? significa 0 o 1 aparición de cualquier carácter entre corchetes: guión, punto o espacio en blanco.
    • A continuación, hay un grupo más de 3 dígitos d{3} seguido de cualquier guión, punto o espacio en blanco [\-\.\s]? que aparece 0 o 1 vez.
    • El último grupo de 4 dígitos \d{4} va seguido de un límite de palabra \b para dejar claro que un número de teléfono no puede formar parte de un número mayor.

    Con la cadena original en A5 y la expresión regular en A2, la fórmula adopta esta forma:

    =RegExpMatch(A5, $A$2)

    ... y funciona exactamente como se esperaba:

    Notas:

    • Los códigos internacionales no se comprueban, por lo que pueden estar presentes o no.
    • En las expresiones regulares, \s significa cualquier carácter de espacio en blanco, como un espacio, un tabulador, un retorno de carro o una nueva línea. Para permitir sólo espacios, utilice [-\. ] en lugar de [-\.\s].
    • Regex para NO coincidir con carácter

      Para buscar cadenas que NO contengan un carácter determinado, puede utilizar clases de caracteres negados [^ ] que coinciden con todo lo que NO esté entre paréntesis. Por ejemplo:

      • [^13] coincidirá con cualquier carácter que no sea 1 ó 3.
      • [^1-3] coincidirá con cualquier carácter que no sea 1, 2 ó 3 (es decir, cualquier dígito del 1 al 3).

      En una lista de números de teléfono, supongamos que desea encontrar los que no tienen un código de país. Teniendo en cuenta que cualquier código internacional incluye el signo +, puede utilizar la clase de caracteres [^\+] para encontrar cadenas que no contengan un signo +. Es importante darse cuenta de que la expresión anterior coincide con cualquier carácter que no sea +. Dado que un número de teléfono puede estar en cualquier lugar de una cadena, nonecesariamente al principio, se añade el cuantificador * para comprobar cada carácter posterior. Las anclas de inicio ^ y final $ garantizan que se procese toda la cadena. Como resultado, obtenemos la siguiente expresión regular que dice "no coincidir con el carácter + en ninguna posición de la cadena".

      Patrón : ^[^\+]*$

      =RegExpMatch(A5, "^[^\+]*$")

      Regex para NO coincidir con cadena

      Aunque no existe una sintaxis de expresión regular especial para no coincidir con una cadena específica, puede emular este comportamiento utilizando un lookahead negativo.

      Supongamos que desea encontrar cadenas que no contengan la palabra "limones". Esta expresión regular funcionará de maravilla:

      Patrón ^(?!limones).)*$

      Obviamente, aquí se necesita alguna explicación. El lookahead negativo (?!lemons) mira a la derecha para ver si no hay ninguna palabra "lemons" delante. Si "lemons" no está ahí, entonces el punto coincide con cualquier carácter excepto un salto de línea. La expresión anterior realiza sólo una comprobación, y el cuantificador * la repite cero o más veces, desde el inicio de la cadena anclada por ^ hasta el final de la cadena anclada por$.

      Para ignorar las mayúsculas y minúsculas del texto, establecemos el tercer argumento en FALSE para que nuestra función no distinga entre mayúsculas y minúsculas:

      =RegExpMatch(A5, $A$2, FALSE)

      Consejos y notas:

      • La expresión regular anterior sólo funciona para una línea En el caso de cadenas de mil líneas, los caracteres ^ y $ coinciden con el principio y el final de cada línea en lugar de con el principio y el final de la cadena de entrada, por lo que la expresión regular sólo busca en la primera línea.
      • Para coincidir con cadenas que no arrancar con un texto determinado utilice una expresión regular como ^(?!limones).*$
      • Para coincidir con cadenas que no terminen con un texto determinado incluya el ancla de la cadena final en el patrón de búsqueda: ^((?!limones$).)*$

      Coincidencia sin distinción entre mayúsculas y minúsculas

      En las expresiones regulares clásicas, existe un patrón especial para las coincidencias sin distinción entre mayúsculas y minúsculas (?i), que no se admite en VBA RegExp. Para superar esta limitación, nuestra función personalizada acepta el tercer argumento opcional denominado match_case Para no distinguir entre mayúsculas y minúsculas, basta con ponerlo a FALSE.

      Supongamos que desea identificar fechas como 1-Mar-22 o 01-MAR-2022. Para que coincida con el dd-mmm-aaaa y d-mmm-aa utilizamos la siguiente expresión regular.

      Patrón : \b\d{1,2}-(Jan

      Nuestra expresión busca un grupo de 1 ó 2 dígitos, seguidos de un guión, seguidos de cualquiera de las abreviaturas del mes separadas por

      ¿Por qué no utilizar un patrón más sencillo como \d{1,2}-[A-Za-z]{3}-\d{2,4}\b? Para evitar falsas coincidencias positivas como 01-ABC-2020.

      Introduce el patrón en A2 y obtendrás la siguiente fórmula:

      =RegExpMatch(A5, $A$2, FALSE)

      Regex para cotejar direcciones de correo electrónico válidas

      Como es sabido, una dirección de correo electrónico consta de 4 partes: nombre de usuario, símbolo @, nombre de dominio (servidor de correo) y dominio de nivel superior (como .com, .edu, .org, etc.). Para comprobar la validez de la dirección de correo electrónico, tendremos que replicar la estructura anterior utilizando expresiones regulares.

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

      Para entender mejor lo que está pasando aquí, vamos a echar un vistazo más de cerca a cada parte:

      • Nombre de usuario puede incluir letras, números, guiones bajos, puntos y guiones. Teniendo en cuenta que \w coincide con cualquier letra, dígito o guión bajo, obtenemos la siguiente regex: [\w\.\-]+
      • Nombre de dominio puede incluir letras mayúsculas y minúsculas, dígitos, guiones (pero no en la primera ni en la última posición) y puntos (en caso de subdominios). Dado que los guiones bajos no están permitidos, en lugar de \w utilizamos 3 conjuntos de caracteres diferentes: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+
      • Dominio de nivel superior consiste en un punto seguido de letras mayúsculas y minúsculas. Puede contener de 2 a 24 letras (el TLD más largo que existe actualmente): \.[A-Za-z]{2,24}

      Nota: el patrón asume que el nombre de dominio contiene 2 o más caracteres alfanuméricos.

      Con el texto original en A5 y el patrón en A5, la fórmula toma esta forma:

      =RegExpMatch(A5, $A$2)

      También puede utilizar una expresión regular más sencilla para la validación del correo electrónico con un conjunto de caracteres en minúsculas o mayúsculas:

      Patrón : \b[\w\.\-]+@[a-z0-9]+[a-z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b

      Pero haga que su fórmula no distinga entre mayúsculas y minúsculas:

      =RegExpMatch(A5, $A$2, FALSE)

      Fórmula IF de Excel con match regex

      Dado que las funciones incorporadas y las personalizadas se llevan bien, no hay nada que le impida utilizarlas juntas en una misma fórmula.

      Para devolver o calcular algo si una expresión regular coincide y otra cosa si no coincide, incruste la función personalizada RegExpMatch en el texto lógico de IF:

      IF(RegExpMatch(...), [valor_si_verdadero], [valor_si_falso])

      Por ejemplo, si una cadena en A5 contiene una dirección de correo electrónico válida, puede devolver "Sí"; en caso contrario, "No".

      =IF(RegExpMatch(A5, $A$2,), "Sí", "No")

      Cuenta si la expresión regular coincide

      Dado que las funciones nativas de Excel no admiten expresiones regulares, no es posible introducir una expresión regular directamente en la función COUNTIS o COUNTIFS. Por suerte, puede emular esta funcionalidad utilizando nuestra función personalizada.

      Supongamos que ha utilizado una expresión regular para hacer coincidir los números de teléfono y obtener los resultados en la columna B. Para averiguar cuántas celdas contienen números de teléfono, sólo tiene que contar los valores TRUE en B5:B9. Y eso se puede hacer fácilmente utilizando la fórmula COUNTIF estándar:

      =COUNTIF(B5:B9, TRUE)

      ¿No quiere columnas adicionales en su hoja de cálculo? No hay problema. Teniendo en cuenta que nuestra función personalizada puede procesar varias celdas a la vez y que la SUMA de Excel puede sumar valores en una matriz, esto es lo que debe hacer:

      • Proporcione una referencia de rango a RegExpMatch, para que devuelva una matriz de valores TRUE y FALSE.
      • Utilice una negación doble (--) para coaccionar los valores lógicos a unos y ceros.
      • Utiliza la función SUMA para sumar 1's y 0's en el array resultante.

      =SUMA(--RegExpMatch(A5:A9, $A$2))

      Concordancia Regex con Ultimate Suite

      Los usuarios de nuestra Ultimate Suite pueden aprovechar cuatro potentes funciones Regex sin añadir ningún código VBA a sus libros de trabajo, ya que se integran sin problemas en Excel durante la instalación del complemento. Nuestras funciones personalizadas son procesadas por el motor RegEx estándar de .NET y admiten expresiones regulares clásicas con todas las funciones.

      Cómo utilizar la función RegexMatch personalizada

      Suponiendo que tenga instalada la última versión de Ultimate Suite (2021.4 o posterior), puede crear una fórmula Regex Match en dos sencillos pasos:

      1. En el Datos de Ablebits en la pestaña Texto grupo, haga clic en Herramientas Regex .

    • En el Herramientas Regex haga lo siguiente:
      • Selecciona las cadenas de origen.
      • Introduzca su patrón.
      • Elija el Partido opción.
      • Para obtener los resultados como fórmulas y no como valores, seleccione la opción Insertar como fórmula casilla de verificación.
      • Haga clic en el botón Partido botón.

      Un momento después, el AblebitsRegexMatch se inserta en una nueva columna a la derecha de sus datos.

      En la siguiente captura de pantalla, la función comprueba si las cadenas de la columna A contienen números de 7 dígitos o no.

      Consejos:

      • La función puede ser insertado directamente en una celda a través de la norma Función de inserción donde está clasificado en AblebitsUDFs .
      • Por defecto, se añade una expresión regular a la fórmula, pero también puede mantenerla en una celda separada. Para ello, sólo tiene que utilizar una referencia de celda para el 2º argumento.
      • Por defecto, la función es distingue entre mayúsculas y minúsculas Para distinguir entre mayúsculas y minúsculas, utilice el patrón (?i).

      Para más información, consulte la función AblebitsRegexMatch.

      Así es como se hace la correspondencia de expresiones regulares en Excel. Te doy las gracias por leer y ¡espero verte en nuestro blog la semana que viene!

      Descargas disponibles

      Ejemplos de Excel Regex Match (archivo .xlsm)

      Ultimate Suite 14 días versión totalmente funcional (archivo .exe)

    Michael Brown es un entusiasta de la tecnología dedicado y apasionado por simplificar procesos complejos utilizando herramientas de software. Con más de una década de experiencia en la industria de la tecnología, ha perfeccionado sus habilidades en Microsoft Excel y Outlook, así como en Google Sheets y Docs. El blog de Michael está dedicado a compartir su conocimiento y experiencia con otros, brindando consejos y tutoriales fáciles de seguir para mejorar la productividad y la eficiencia. Ya sea un profesional experimentado o un principiante, el blog de Michael ofrece información valiosa y consejos prácticos para aprovechar al máximo estas herramientas de software esenciales.