Expresiones regulares para humanos: Una guía práctica
Las expresiones regulares (regex) tienen un problema de reputación. Parecen como si alguien se hubiera quedado dormido sobre el teclado: ^[\w.-]+@[\w-]+\.[\w.]+$. Aparecen en revisiones de código, editores de texto, herramientas de búsqueda y validación de formularios. Los desarrolladores o las adoran o las evitan por completo.
La verdad está en algún punto intermedio. Regex es genuinamente potente. También es genuinamente confuso al principio. Pero no necesitas dominar cada característica oscura para obtener valor práctico. Un puñado de patrones cubre la gran mayoría de los casos de uso reales.
Qué hace realmente regex
Una expresión regular es un patrón que describe un conjunto de cadenas de texto. Se lo pasas a una herramienta de búsqueda y esta encuentra cada cadena que coincide con el patrón. Piensa en ello como una consulta de búsqueda muy precisa.
Búsqueda normal: encontrar exactamente "hola" Búsqueda con regex: encontrar cualquier cosa que se parezca a una dirección de email, un número de teléfono, una fecha, una URL o cualquier otro patrón que puedas describir.
¿Sabías que? Las expresiones regulares fueron inventadas por el matemático Stephen Kleene en 1956 como una notación para describir "lenguajes regulares" en la teoría de lenguajes formales. Llegaron a la informática a través de los primeros editores de texto Unix en las décadas de 1960 y 1970.
Los bloques fundamentales
Caracteres literales
La regex más simple es simplemente texto literal. El patrón hello coincide con la cadena "hello". Nada sofisticado.
El punto (.) — Cualquier carácter individual
Un punto coincide con cualquier carácter individual (excepto un salto de línea).
h.tcoincide con "hat", "hit", "hot", "hut" e incluso "h3t"
Clases de caracteres ([]) — Caracteres específicos
Los corchetes definen un conjunto de caracteres permitidos en esa posición.
[aeiou]coincide con cualquier vocal individual[0-9]coincide con cualquier dígito[A-Za-z]coincide con cualquier letra (mayúscula o minúscula)[^0-9]coincide con cualquier carácter que NO sea un dígito (el^dentro de corchetes significa "no")
Cuantificadores — Cuántos
Estos símbolos controlan la repetición:
| Símbolo | Significado | Ejemplo | Coincide con |
|---|---|---|---|
* |
Cero o más | ab*c |
"ac", "abc", "abbc", "abbbc" |
+ |
Uno o más | ab+c |
"abc", "abbc", "abbbc" (no "ac") |
? |
Cero o uno | colou?r |
"color" y "colour" |
{3} |
Exactamente 3 | a{3} |
"aaa" |
{2,4} |
Entre 2 y 4 | a{2,4} |
"aa", "aaa", "aaaa" |
Anclas — Posición
^al inicio significa "comienzo de la cadena"$al final significa "fin de la cadena"^hello$coincide solo con la cadena exacta "hello", no con "say hello" o "hello world"
Clases abreviadas
Las clases de caracteres comunes tienen atajos:
| Abreviatura | Equivalente | Significado |
|---|---|---|
\d |
[0-9] |
Cualquier dígito |
\w |
[A-Za-z0-9_] |
Cualquier carácter de "palabra" |
\s |
[ \t\n\r] |
Cualquier espacio en blanco |
\D |
[^0-9] |
Cualquier no-dígito |
\W |
[^A-Za-z0-9_] |
Cualquier no-palabra |
\S |
[^ \t\n\r] |
Cualquier no-espacio |
Grupos (()) — Agrupar y capturar
Los paréntesis agrupan partes de un patrón. Esto es útil para aplicar cuantificadores a un grupo o para extraer partes específicas de una coincidencia.
(ab)+coincide con "ab", "abab", "ababab"(\d{3})-(\d{4})coincide con "555-1234" y captura "555" y "1234" por separado
La barra vertical (|) — O
La barra vertical significa "o".
cat|dogcoincide con "cat" o "dog"(jpg|png|gif)coincide con cualquiera de estas tres extensiones de imagen
Patrones prácticos que puedes usar hoy
Coincidir con una dirección de email (simple)
[\w.-]+@[\w-]+\.[\w.]+
Desglosándolo:
[\w.-]+— uno o más caracteres de palabra, puntos o guiones (la parte local)@— arroba literal[\w-]+— uno o más caracteres de palabra o guiones (el dominio)\.— punto literal (escapado porque.es un carácter especial)[\w.]+— uno o más caracteres de palabra o puntos (el TLD)
Advertencia La validación de emails con regex es notoriamente difícil de hacer perfectamente. El patrón simple de arriba cubre el 99% de las direcciones de email del mundo real pero no maneja todos los casos extremos definidos en la especificación RFC. Para validación en producción, usa la biblioteca de validación de emails de tu lenguaje de programación.
Coincidir con un número de teléfono (formato EE.UU.)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
Esto coincide con:
- (555) 123-4567
- 555-123-4567
- 555.123.4567
- 555 123 4567
Coincidir con una URL
https?://[\w.-]+(/[\w./-]*)?
Esto coincide con:
Coincidir con una fecha (AAAA-MM-DD)
\d{4}-\d{2}-\d{2}
Esto coincide con: 2026-03-23, 1999-12-31, etc.
Encontrar palabras duplicadas
\b(\w+)\s+\1\b
Esto coincide con palabras repetidas como "the the" o "is is". El \1 hace referencia a lo que fue capturado por el primer grupo.
Coincidir con una dirección IPv4
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
Esto coincide con patrones como 192.168.1.1 o 10.0.0.255.
Consejos para escribir regex
1. Empieza simple, luego refina
No intentes escribir la regex perfecta al primer intento. Empieza con un patrón amplio, pruébalo contra tus datos y ajústalo.
2. Prueba siempre
Es fácil equivocarse con regex. Un cuantificador que falta o un punto sin escapar puede cambiar completamente lo que coincide. Siempre prueba tu patrón contra datos del mundo real antes de usarlo en producción.
3. Escapa los caracteres especiales
Si necesitas coincidir con un punto literal, un paréntesis, un corchete u otro carácter especial, escápalo con una barra invertida: \., \(, \[.
4. Usa comentarios y grupos nombrados
En patrones complejos, usa grupos nombrados y comentarios (donde se soporten) para hacer la regex legible. Tu yo del futuro te lo agradecerá.
5. Sabe cuándo NO usar regex
Regex es la herramienta equivocada para analizar HTML, XML, JSON o cualquier estructura anidada. Usa un parser adecuado para eso.
Consejo Prueba y depura tus patrones regex en tiempo real: Cómo probar patrones regex. Pega tu patrón y datos de prueba, y ve las coincidencias resaltadas al instante.
Empieza a probar regex ahora mismo:
Gratis, con retroalimentación instantánea y sin necesidad de registro.