Unir cadenas usando expresiones regulares
¿Alguna vez te has encontrado con la necesidad de combinar múltiples cadenas de texto en una sola, pero te has sentido abrumado por la cantidad de datos y la complejidad de la tarea? Las expresiones regulares pueden ser tu mejor aliada en este ámbito. En este artículo, descubrirás cómo estas potentes herramientas pueden simplificar y optimizar el proceso de unir cadenas. Ya sea que estés trabajando en análisis de datos, procesamiento de texto o simplemente quieras automatizar tareas tediosas, las expresiones regulares te brindarán la flexibilidad y la precisión que necesitas. Prepárate para desatar el verdadero potencial de tu código y transformar la forma en que manejas la información. ¡Empecemos esta aventura en el fascinante mundo de las expresiones regulares!
¿Alguna vez has necesitado combinar varias cadenas de texto de una manera rápida y eficiente? Si es así, las expresiones regulares son tu mejor aliado. En este artículo, descubriremos cómo unir cadenas usando expresiones regulares y cómo aprovechar al máximo esta poderosa herramienta de programación. ¡No te lo pierdas!
En este tutorial, veremos en profundidad cómo usar expresiones regulares para hacer coincidir cadenas en Excel.
Cuando necesite encontrar un valor determinado en un rango de celdas, usará la función COINCIDIR o XMATCH. Al buscar una cadena específica en una celda, las funciones BUSCAR y BUSCAR resultan útiles. ¿Y cómo saber si una celda contiene información que coincide con un patrón determinado? Obviamente, mediante el uso de expresiones regulares. ¡Pero Excel no admite expresiones regulares! No te preocupes, lo obligaremos a hacerlo 🙂
Función Excel VBA Regex para hacer coincidir cadenas
Como queda bastante claro en el título, para utilizar expresiones regulares en Excel, debe crear su propia función. Afortunadamente, VBA de Excel tiene una función incorporada. ExpReg objeto, que puede utilizar en su código como se muestra a continuación:
Público Función RegExpMatch(rango_entrada Como Rango, patrón Como Cadena, Opcional caso_partido Como Booleano = Verdadero) Como Variante
Oscuro arRes() Como Variante ‘matriz para almacenar los resultados
Oscuro iInputCurRow, iInputCurCol, cntInputRows, cntInputCols Como Largo ‘índice de la fila actual en el rango de origen, índice de la columna actual en el rango de origen, recuento de filas, recuento de columnas
En Error Ir a ErrHandl RegExpMatch = arRes
Colocar expresión regular = Crear objeto(«VBScript.RegExp») expresión regular.patrón = patrón expresión regular.Global = Verdadero
expresión regular.MultiLine = Verdadero
Si Verdadero = caso_partido Entonces
expresiones regulares.ignorecase = FALSO
Demás
expresiones regulares.ignorecase = Verdadero
Fin Si
cntInputRows = rango_entrada.Rows.Count cntInputCols = rango_entrada.Columnas.Count
Redim arRes(1 A cntEntradaFilas, 1 A cntColsEntrada)
Para iInputCurRow = 1 A cntEntradaFilas
Para iEntradaCurCol = 1 A cntInputCols arRes(iInputCurRow, iInputCurCol) = regex.Test(input_range.Cells(iInputCurRow, iInputCurCol).Value)
Próximo
Próximo
RegExpMatch = arRes
Salida Función
ErrHandl: RegExpMatch = CVErr(xlErrValue)
Fin Función
Pegue el código en el editor VBA y su nuevo Coincidencia de expresiones regulares La función está lista para su uso. Si no tiene mucha experiencia con VBA, esta guía puede resultarle útil: Cómo insertar código VBA en Excel.
Nota. Después de insertar el código, recuerde guardar su archivo como libro de trabajo habilitado para macros (.xlsm).
Sintaxis de RegExpMatch
El Coincidencia de expresiones regulares La función comprueba si alguna parte de la cadena fuente coincide con una expresión regular. El resultado es un valor booleano: VERDADERO si se encuentra al menos una coincidencia, FALSO 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 para buscar. Se puede proporcionar 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 estar entre comillas dobles.
- caso_partido (opcional): define el tipo de coincidencia. Si es VERDADERO o se omite (predeterminado), se realiza una coincidencia que distingue entre mayúsculas y minúsculas; si es FALSO, no 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 debes saber sobre RegExpMatch
Antes de pasar a los cálculos prácticos, tenga en cuenta los siguientes puntos que aclaran algunos tecnicismos:
A continuación, encontrará algunos ejemplos de coincidencias de expresiones regulares que se crearon 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 trabajo reales. Antes de poner en producción, asegúrese de probar y ajustar nuestros patrones de muestras según sus necesidades.
Cómo usar expresiones regulares 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 elementos. Desea saber qué celdas tienen SKU. Suponiendo que cada SKU consta de 2 letras mayúsculas, un guión y 3 dígitos, puede relacionarlos utilizando la siguiente expresión.
Patrón: b[A-Z]{2}-d{3}b
Dónde [A-Z]{2} significa 2 letras mayúsculas cualesquiera de la A a la Z y d{3} significa 3 dígitos cualesquiera del 0 al 9. El carácter b denota el límite de una palabra, lo que significa que un SKU es una palabra separada y no parte de una palabra más grande. cadena como 23-MAR-2022.
Una vez establecido el patrón, podemos pasar a escribir una fórmula. Básicamente, utilizar una función personalizada no es diferente de una nativa. Tan pronto como comience 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, consulte 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 se puede guardar en una celda predefinida, que está bloqueada con una referencia absoluta ($A$2):
=RegExpMatch(A5, $A$2)
Después de ingresar la fórmula en la primera celda, puede arrastrarla hacia todas las demás filas.
Este método funciona maravillosamente en todas las versiones de excel.
>Haga coincidir cadenas en varias celdas a la vez
Para hacer coincidir varias cadenas con una única 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 esta manera: escribes la fórmula en la primera celda, presionas Ingresary la fórmula se extiende automáticamente a las celdas siguientes.
>En excel 2019 y antes, solo funciona como una fórmula matricial CSE tradicional, que se ingresa en un rango de celdas y se completa presionando el botón Ctrl + Mayús + Intro llaves juntas.
>Regex para que coincida con el número
Para hacer coincidir cualquier dígito del 0 al 9, utilice el d carácter en la expresión regular. Dependiendo de su tarea particular, agregue un cuantificador adecuado o cree un patrón más complejo.
Regex para que coincida con cualquier número
Para hacer coincidir cualquier número de cualquier longitud, coloque el cuantificador + justo después del carácter /d, que indica buscar 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 hacer coincidir valores numéricos que contienen una cierta cantidad de dígitos, utilice d junto con un cuantificador apropiado.
Por ejemplo, para hacer coincidir números de factura que constan exactamente de 7 dígitos, usarí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 o 100 dígitos. Si esto no es lo que buscas, coloca la palabra límite b en ambos lados.
Patrón: bd{7}b
=RegExpMatch(A5:A9, «bd{7}b»)
>Regex para hacer coincidir números de teléfono
Dado que los números de teléfono se pueden escribir en varios formatos, compararlos 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 primeros 2 grupos y 4 dígitos en el último grupo. Los grupos se pueden separar con punto, guión o espacio. El primer grupo puede estar entre paréntesis o no.
Patrón: ((d{3})|d{3})[-.s]?d{3}[-.s]?d{4}b
Desglosando esta expresión regular, esto es lo que obtenemos:
- La primera parte ((d{3})|d{3}) coincide con un número de 3 dígitos dentro o sin paréntesis.
- El [-.s]? parte 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]? apareciendo 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 ser parte de un número mayor.
Con la cadena original en A5 y la expresión regular en A2, la fórmula toma esta forma:
=RegExpMatch(A5, $A$2)
… y funciona exactamente como se esperaba:
>
Notas:
- Los códigos internacionales no se verifican, por lo que pueden estar presentes o no.
- En expresiones regulares, s representa cualquier carácter de espacio en blanco, como un espacio, tabulación, retorno de carro o nueva línea. Para permitir sólo espacios, utilice [-. ] en lugar de [-.s].
Regex para NO coincidir con el carácter
Para buscar cadenas que NO contengan un determinado carácter, puede utilizar clases de caracteres negados. [^ ] que coincida con cualquier cosa que NO esté entre paréntesis. Por ejemplo:
- [^13] coincidirá con cualquier carácter que no sea 1 o 3.
- [^1-3] coincidirá con cualquier carácter que no sea 1, 2 o 3 (es decir, cualquier dígito del 1 al 3).
En una lista de números de teléfono, supongamos que desea buscar aquellos que no tienen código de país. Teniendo en cuenta que cualquier código internacional incluye el signo +, puedes utilizar el [^+] clase de caracteres para buscar cadenas que no contengan un signo más. Es importante darse cuenta de que la expresión anterior coincide con cualquier carácter que no sea +. Debido a que un número de teléfono puede estar en cualquier parte de una cadena, no necesariamente al principio, se agrega el cuantificador * para verificar cada carácter posterior. Los anclajes start ^ y end $ garantizan que se procese toda la cadena. Como resultado, obtenemos la siguiente expresión regular que dice «no coincide con el carácter + en ninguna posición de la cadena».
Patrón: ^[^+]ps
=RegExpMatch(A5, «^[^+]*$»)
>Regex para NO coincidir con la cadena
Aunque no existe una sintaxis de expresión regular especial para no coincidir con una cadena específica, puede emular este comportamiento utilizando una búsqueda anticipada negativa.
Supongamos que desea encontrar cadenas que no contiene la palabra «limones». Esta expresión regular funcionará de maravilla:
Patrón: ^((?!limones).)*$
Obviamente, aquí se necesita alguna explicación. La mirada negativa hacia adelante (?!limones) mira hacia la derecha para ver si no hay ninguna palabra «limones» delante. Si «limones» no está allí, entonces el punto coincide con cualquier carácter excepto un salto de línea. La expresión anterior realiza solo una verificació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 el texto entre mayúsculas y minúsculas, configuramos el tercer argumento en FALSO 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 linea sola instrumentos de cuerda. 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 del principio y el final de la cadena de entrada, por lo tanto, la expresión regular solo busca en la primera línea.
- Para hacer coincidir cadenas que no empieces con cierto textoutilice una expresión regular como ^(?!lemons).*$
- Para hacer coincidir cadenas que no termines con cierto textoincluya el ancla de cadena final en el patrón de búsqueda: ^((?!lemons$).)*$





>
>
Kattaylorel: ¡Totalmente de acuerdo, jarquin! Al principio me daba un poco de miedo usar expresiones regulares, pero cuando las empecé a incorporar en mis proyectos, ¡fue un cambio de juego! Recuerdo que tenía que limpiar unos datos súper enredados y, gracias a regex, lo hice en un abrir y cerrar de ojos. Definitivamente hay que perder el miedo y sacarle jugo a esta herramienta.
Jarquin: ¡Me encantó el artículo! La verdad es que nunca había usado expresiones regulares para unir cadenas, pero una vez que lo probé, fue una locura lo fácil que se volvió mi trabajo. Recuerdo que estaba lidiando con un proyecto y usar regex me ahorró un montón de tiempo, ¡es una herramienta súper poderosa!
Cesar diego: ¡Exacto, kattaylorel! Al principio también me sentía algo perdido con las expresiones regulares, pero una vez que entendí cómo funcionan, me hice fan. Recuerdo que en un proyecto anterior tenía un lío terrible con unas cadenas de texto, y al aplicar regex, todo se fue resolviendo rapidísimo. La verdad es que es impresionante lo que se puede hacer con un poco de práctica. ¡A seguir explorando!