Qué es una expresión regular
Una regex (regular expression) es un mini lenguaje para describir patrones en texto. Con unos pocos caracteres podés decir cosas como "una secuencia de tres dígitos seguida de un guion y cuatro dígitos más" (un teléfono \d{3}-\d{4}) o "un email" (\b\w+@\w+\.\w+\b). Existen desde 1968 y siguen siendo la herramienta más concisa para validar, extraer y reemplazar texto.
Caracteres más usados
.— cualquier carácter excepto salto de línea.\d— un dígito (0-9).\w— un carácter de palabra (letra, dígito, underscore).\s— un espacio (incluye tabs y saltos de línea).+— uno o más del anterior.*— cero o más del anterior.?— cero o uno del anterior.{n,m}— entre n y m repeticiones.^— inicio de línea (con flag m) o inicio del string.$— fin de línea o del string.[abc]— uno de a, b o c.[^abc]— cualquier cosa menos a, b o c.
Patrones comunes que vale la pena memorizar
- Email simple:
\b[\w.-]+@[\w.-]+\.\w+\b— captura la mayoría de emails reales. - URL:
https?://\S+— http o https seguido de cualquier carácter no espacio. - IP v4:
\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b. - Fecha YYYY-MM-DD:
\d{4}-\d{2}-\d{2}. - Hex color:
#[0-9a-fA-F]{3,8}. - Solo dígitos:
^\d+$con flag m para validar línea por línea.
Flags y qué cambian
- g (global): sin esto, regex devuelve solo el primer match. Casi siempre la querés.
- i (insensitive): ignora mayúsculas/minúsculas.
/Hola/imatchea HOLA, hola, HoLa. - m (multiline): hace que
^y$coincidan con inicio/fin de línea, no solo de string. - s (dotall): hace que
.también matchee saltos de línea. - u (unicode): tratamiento correcto de caracteres Unicode complejos.
- y (sticky): el match arranca desde lastIndex.
Trampas frecuentes
- Greedy vs lazy.
.*es greedy: agarra todo lo que pueda..*?es lazy: agarra lo mínimo. Para extraer "el contenido entre comillas más cercano", usá lazy. - Olvidarse del flag g. Sin g, replace solo cambia el primer match.
"aaa".replace(/a/, 'b')da "baa", no "bbb". - Escapes en strings. En JavaScript,
"\d"no es lo mismo que"\\d". En literales/\d/está bien; en strings hay que doblar. - Catastrophic backtracking. Patrones como
(a+)+bsobre input largo pueden colgar el browser. Usá patrones lineales si vas a procesar texto grande.
Cuándo NO usar regex
Para parsear HTML, JSON, CSV o cualquier formato anidado, regex es una mala idea. Esos formatos requieren parsers reales. La famosa respuesta de Stack Overflow "you cannot parse [X]HTML with regex" es una verdad universal: regex solo entiende lenguajes regulares, y HTML no es regular. Para esos casos usá el parser nativo (DOMParser, JSON.parse, una lib de CSV).
Tips de productividad
Si vas a usar la misma regex en varios lugares, ponele un nombre y comentala. Las regex son ilegibles a primera vista; un comentario ahorra debugging. En JavaScript, podés usar //x con la flag x en algunos engines (no en JS estándar) o construir la regex con new RegExp(string) partiendo de partes nombradas. En código real, considerá librerías como Yup o Zod para validación, que abstraen las regex más comunes con APIs declarativas.