Cómo crear expresiones regulares sin volverte loco
Ves un patrón como ^[\w.-]+@[\w-]+\.[a-z]{2,}$ y tu cerebro se apaga. Las expresiones regulares —regex— tienen la peor reputación de la programación: parecen jeroglíficos y un solo carácter mal puesto lo rompe todo. Pero la realidad es que el 90 % de lo que necesitas son una docena de símbolos que se aprenden en una tarde.
En este tutorial construirás expresiones regulares capa por capa, desde buscar texto literal hasta validar emails y teléfonos españoles, con ejemplos que puedes probar y una estrategia para no volverte loco en el intento.
Nivel 1: texto literal, el punto y las clases
Una regex es un patrón que describe un conjunto de textos: el motor busca las partes del texto que casan con el patrón. El nivel más simple es el texto literal: la regex «gato» casa con la palabra «gato» donde aparezca. Ya sabes usar regex: cada vez que usas Ctrl+F estás usando el nivel cero.
El primer símbolo especial es el punto (.): casa con cualquier carácter excepto el salto de línea. «g.to» casa con «gato», «gito» y «g3to». Es comodín total: potente pero impreciso, así que úsalo con moderación.
Las clases de caracteres acotan el comodín: [aeiou] casa con una vocal cualquiera; [0-9] con un dígito; [a-z] con una letra minúscula. «gr[ae]y» casa con «grey» y «gray». Y las clases negadas invierten la lógica: [^0-9] casa con cualquier carácter que NO sea un dígito. Con literales, punto y clases ya puedes describir patrones sorprendentemente útiles.
Nivel 2: cuantificadores y atajos
Los cuantificadores dicen cuántas veces se repite lo anterior. Los tres básicos: * (cero o más veces), + (una o más veces) y ? (cero o una vez, opcional). «a+» casa con «a», «aaa» y «aaaaaaa»; «colou?r» casa con «color» y «colour».
Las llaves dan control exacto: {3} exactamente tres veces, {2,4} entre dos y cuatro, {2,} dos o más. \d{9} casa con exactamente nueve dígitos —un número de teléfono español sin prefijo—. [a-z]{2,} casa con palabras de dos o más letras minúsculas.
Existen también atajos universales que debes memorizar: \d es un dígito [0-9], \w es un carácter de palabra [a-zA-Z0-9_], \s es un espacio en blanco. Y sus mayúsculas los niegan: \D no-dígito, \W no-palabra, \S no-espacio. Con clases + cuantificadores + atajos tienes el 70 % de las regex cotidianas.
Nivel 3: anclajes, grupos y alternancia
Los anclajes fijan el patrón a posiciones del texto: ^ es el inicio y $ es el final. «^gato» solo casa si el texto empieza por «gato»; «gato$» solo si termina con «gato»; «^\d+$» casa con textos que son solo dígitos de principio a fin —la forma estándar de validar que un campo contiene únicamente números—.
Los paréntesis crean grupos con dos superpoderes: aplicar cuantificadores a varias cosas a la vez —(ab)+ casa con «ab», «abab», «ababab»— y capturar lo casado para reutilizarlo después. En la mayoría de los lenguajes puedes referenciar lo capturado: en una sustitución, $1 es el contenido del primer grupo.
La alternancia con | significa «o»: «gato|perro» casa con cualquiera de las dos palabras. Combinada con grupos —(lunes|martes|miércoles)— describe listas cerradas de opciones. Anclajes, grupos y alternancia te permiten validar formatos completos, como veremos en los ejemplos.
Ejemplos reales: email, teléfono español y fecha
Hora de construir algo real: validar un email. El patrón ^[\w.-]+@[\w-]+\.[a-z]{2,}$ se lee por piezas: ^ inicio; [\w.-]+ uno o más caracteres de palabra, punto o guion (el usuario); @ la arroba literal; [\w-]+ el dominio; \. el punto literal —escapado porque . solo significa «cualquier carácter»—; [a-z]{2,} la extensión de dos o más letras; $ final.
Cuidado con la trampa: este patrón valida el formato, no la existencia. «usuario@dominio.abc» pasa la validación aunque el dominio no exista. Para emails reales, la validación definitiva es enviar un correo de confirmación: la regex solo filtra errores de tecleo.
Un teléfono español: ^(\+34)?[6789]\d{8}$ —prefijo +34 opcional, primer dígito 6, 7, 8 o 9 (móviles y fijos españoles), y ocho dígitos más—. Y una fecha en formato dd/mm/aaaa: ^\d{2}/\d{2}/\d{4}$ —valida el formato, no si el día existe; el 99/99/9999 pasaría, así que la validación semántica va después en tu código—.
La estrategia anti-locura: construir, probar, documentar
La estrategia que evita la locura tiene cuatro reglas. Primera: construye por incrementos. Empieza con el patrón más simple que case con tu caso básico y añade piezas una a una, probando en cada paso. Nunca escribas una regex de 40 caracteres de una sentada.
Segunda: prueba con casos positivos Y negativos. Tu patrón de email debe aceptar «ana@ejemplo.com» y rechazar «ana@@ejemplo», «ana@» y «@ejemplo.com». Los negativos son los que revelan los agujeros: un patrón que acepta todo no valida nada.
Tercera: usa un probador visual con resaltado —regex101.com es el estándar— que muestre qué parte del texto casa con cada parte del patrón. Ver el casado en colores convierte el jeroglífico en algo legible.
Cuarta: documenta tus regex con un comentario y ejemplos. Dentro de seis meses, ni tú recordarás qué hace ^(?=.*[A-Z])(?=.*\d).{8,}$ —que exige al menos una mayúscula, un dígito y 8 caracteres—. Un comentario con dos ejemplos de lo que acepta y rechaza vale más que el patrón solo. Y si necesitas codificar esos resultados para transportarlos por un canal de texto, la herramienta gratuita de Base64 (usatotem.com/herramientas-desarrollador/base64/) los convierte en cadenas seguras al instante.
Herramientas gratuitas mencionadas
Preguntas frecuentes
¿Las regex son iguales en todos los lenguajes?
Sí, con matices: la mayoría de los motores modernos (PCRE, JavaScript, Python) comparten la sintaxis básica, pero hay diferencias en funciones avanzadas como lookbehind o grupos con nombre. Un patrón simple como ^\d+$ funciona igual en casi todos; los avanzados conviene probarlos en tu motor concreto.
¿Cómo depuro una expresión regular que no funciona?
Usa un probador online con modo de explicación: pega tu patrón y una cadena de ejemplo, y observa qué parte casa con qué. Descompón el patrón en piezas y prueba cada una por separado antes de combinarlas.
¿Por qué mi patrón con punto casa con todo?
Porque el punto coincide con cualquier carácter excepto el salto de línea. Para buscar un punto literal debes escaparlo: \. En general, escapa siempre los caracteres especiales (. * + ? ^ $ [ ] ( ) { } | \) cuando los busques literalmente.
¿Puedo usar regex para validar HTML?
No para HTML, XML ni lenguajes anidados en general: las regex no manejan estructuras anidadas arbitrarias. Para parsear HTML usa un parser DOM; para JSON, un parser JSON. Las regex son para texto plano con patrones regulares, no para lenguajes con anidamiento.
En resumen
Las expresiones regulares se dominan por capas: primero los literales y las clases básicas, después los cuantificadores, luego los anclajes y grupos, y por último las aserciones avanzadas. Con ese orden y la disciplina de probar cada patrón con casos positivos y negativos, pasarás del miedo a la fluidez en semanas, no meses.
Guarda tus patrones probados en una biblioteca personal y reutilízalos: la mayoría de los programadores usan una docena de regex que ya escribieron una vez. Y cuando necesites transportar los resultados de tus validaciones en texto plano, la herramienta gratuita de Base64 te permite codificarlos de forma segura para cualquier canal.