Caracteres y escapes
Detalles →| Sintaxis | Significado · ejemplo |
|---|---|
| abc | los caracteres a, b, c en orden |
| . | cualquier carácter excepto un salto de línea |
| \. \* \\ | un metacarácter tomado literalmente |
| \t \n \r | tabulador, salto de línea, retorno de carro |
Clases y abreviaturas
Detalles →| Sintaxis | Significado · ejemplo |
|---|---|
| [abc] | uno de a, b o c |
| [^abc] | cualquier carácter excepto a, b o c |
| [a-z] | un rango: cualquier letra minúscula |
| \d \D | un dígito / algo que no es dígito |
| \w \W | un carácter de palabra [A-Za-z0-9_] / cualquier otro |
| \s \S | espacio en blanco / todo lo demás |
| \p{L} | cualquier letra de cualquier escritura (con el modificador u) |
Anclas
Detalles →| Sintaxis | Significado · ejemplo |
|---|---|
| ^ | inicio del texto (de una línea con m) |
| $ | fin del texto (de una línea con m) |
| \b | un límite de palabra |
| \B | no es un límite de palabra |
Cuantificadores
Detalles →| Sintaxis | Significado · ejemplo |
|---|---|
| * | cero o más |
| + | uno o más |
| ? | opcional: cero o uno |
| {3} | exactamente 3 |
| {2,5} | entre 2 y 5 |
| {2,} | 2 o más |
| *? +? ?? | perezoso: lo menos posible |
Grupos y referencias inversas
Detalles →| Sintaxis | Significado · ejemplo |
|---|---|
| (abc) | un grupo de captura |
| (?:abc) | un grupo que no captura |
| (?<name>abc) | un grupo de captura con nombre |
| \1 | el texto que capturó el grupo 1 |
| \k<name> | el texto que capturó un grupo con nombre |
| a|b | a o b |
Lookaround
Detalles →| Sintaxis | Significado · ejemplo |
|---|---|
| (?=abc) | seguido de abc (lookahead) |
| (?!abc) | no seguido de abc |
| (?<=abc) | precedido de abc (lookbehind) |
| (?<!abc) | no precedido de abc |
Modificadores
Detalles →| Sintaxis | Significado · ejemplo |
|---|---|
| i | ignorar mayúsculas y minúsculas |
| g | global: todas las coincidencias, no solo la primera |
| m | multilínea: ^ y $ en cada línea |
| s | dotall: . también coincide con saltos de línea |
| u | unicode: \p{…} y \u{…} |
| y | sticky: coincide solo en lastIndex |
Reglas y ejemplos
01 Cómo funciona una regex
Una expresión regular (regex) es un pequeño lenguaje de patrones para describir texto. El motor recorre tu patrón y el texto a la vez, de izquierda a derecha, intentando que cada parte del patrón encaje con caracteres de la cadena. Si lo consigue, la cadena coincide.
Dos preguntas cubren casi todo lo que harás:
cada carácter
Un patrón como cat significa “una c, luego una a, luego una t, seguidas”.
cuántas veces
Los cuantificadores como + y * indican cuántas veces puede repetirse lo anterior.
Por defecto, una regex coincide si el patrón aparece en cualquier parte de la cadena: no tiene que cubrirla entera, a menos que lo ancles.
cata cat satcategorydogEn el juego (JavaScript)
02 Caracteres literales
La mayoría de los caracteres coinciden consigo mismos. Letras, dígitos y espacios son literales: regex coincide con el texto “regex”, 42 coincide con “42”. Por defecto se distinguen mayúsculas y minúsculas, así que Cat no coincide con “cat” (el modificador i lo cambia).
codeCODEdecodecoderPrácticaAcademia: Fundamentos de la caza
03 Escapar metacaracteres
Los metacaracteres son la docena de caracteres que tienen un significado especial en regex:
. ^ $ * + ? ( ) [ ] { } | \\ /
Para buscar uno de forma literal, ponle una barra invertida delante. \. coincide con un punto de verdad, \+ con un signo más, \\ con una barra invertida. Dentro de una clase de caracteres, la mayoría pierde su poder y no hace falta escaparlos.
PrácticaAcademia: Fundamentos de la caza · Jugar: Cazas de escape
04 El punto ( . )
El punto . coincide con un solo carácter cualquiera excepto un salto de línea (salvo que actives el modificador s / dotall). Es el token del que más se abusa en las regex: cuando en realidad quieres decir “cualquier letra” o “cualquier dígito”, una clase es más segura.
catcotc4tctcaatAquí c.t necesita exactamente un carácter entre la c y la t, así que “ct” (cero) y “caat” (dos) fallan.
PrácticaAcademia: Fundamentos de la caza
05 Clases de caracteres [ ]
Los corchetes definen un conjunto: coinciden con exactamente uno de los caracteres que contienen. [aeiou] coincide con cualquier vocal. Usa un guion para un rango: [a-z], [0-9], [A-Fa-f0-9] (un dígito hexadecimal). Empieza con ^ para negar: [^0-9] es “cualquier carácter que no sea un dígito”.
| Sintaxis | Significado |
|---|---|
| [abc] | a, b o c |
| [a-z] | cualquier letra minúscula |
| [0-9a-fA-F] | un dígito hexadecimal |
| [^aeiou] | cualquier cosa menos una vocal minúscula |
| [.\-] | un punto o un guion literal (dentro de una clase, la mayoría de los metacaracteres son literales) |
Trampas
[-a], [a-]). Para incluir ], escápalo ([\]a]): en JavaScript [] es una clase vacía, así que []a] no funciona. ^ solo niega si es el primer carácter.PrácticaAcademia: Clases de caracteres · Pack: Castillos de caracteres · Jugar: Cazas de clases de caracteres
06 Clases abreviadas
Las clases abreviadas son atajos de una letra para conjuntos comunes, como \d para cualquier dígito. La mayúscula es la negación de la minúscula correspondiente.
| Sintaxis | Significado |
|---|---|
| \d \D | un dígito [0-9] / algo que no es un dígito |
| \w \W | un carácter de palabra [A-Za-z0-9_] / cualquier otro |
| \s \S | espacio en blanco (espacio, tabulador, salto de línea…) / todo lo demás |
| \t \n \r | tabulador, salto de línea, retorno de carro |
order 66no digits here2026a1b2En el juego (JavaScript)
\d y \w solo cubren ASCII, incluso con el modificador u; usa \p{L} o \p{N} para otras escrituras. \s ya cubre los espacios Unicode. En el golf son mucho más cortos que escribir la clase entera.PrácticaAcademia: Clases de caracteres
07 Anclas y límites
Las anclas coinciden con una posición, no con un carácter: tienen ancho cero.
| Sintaxis | Significado |
|---|---|
| ^ | inicio de la cadena (o de la línea, con el modificador m) |
| $ | fin de la cadena (o de la línea, con el modificador m) |
| \b | un límite de palabra: el borde entre un \w y algo que no es \w |
| \B | una posición que no es un límite de palabra |
Rodea un patrón con ^…$ para obligarlo a coincidir con la cadena entera. \bcat\b coincide con la palabra completa “cat”, pero no con “category” ni con “scatter”.
cata cat satcategorybobcatconcatenatePrácticaAcademia: Anclas y límites · Pack: Levando anclas · Jugar: Cazas de anclas
08 Cuantificadores
Un cuantificador indica cuántas veces puede repetirse el token anterior.
| Sintaxis | Significado |
|---|---|
| * | cero o más |
| + | uno o más |
| ? | cero o uno (opcional) |
| {3} | exactamente 3 |
| {2,5} | entre 2 y 5 |
| {2,} | 2 o más |
Se aplican a lo que tienen justo delante: un carácter, una clase o un grupo. colou?r hace opcional la u (coincide con “color” y “colour”); (ab)+ repite el par.
aaaaaaaaaaaaPrácticaAcademia: Cuantificadores · Pack: La cantera de cuantificadores · Jugar: Cazas de cuantificadores
09 Codicioso, perezoso y posesivo
Por defecto, los cuantificadores son codiciosos: toman todo lo que pueden y luego devuelven caracteres si el resto del patrón los necesita. Añade ? para volver uno perezoso: toma lo menos posible.
Ejemplo clásico: con <a><b>, el codicioso <.*> coincide con todo, mientras que el perezoso <.*?> se detiene en el primer >.
<a><b><one>two<three>Posesivo y atómico (no existen en JavaScript)
a*+) y grupos atómicos ((?>…)) que nunca devuelven caracteres, una protección contra el backtracking catastrófico. JavaScript no tiene ninguno de los dos; puedes emular un grupo atómico con un lookahead y una referencia inversa.PrácticaAcademia: Cuantificadores
10 Alternancia y agrupación
| significa “o” y tiene la precedencia más baja: divide todo el patrón, salvo que lo encierres entre paréntesis. cat|dog coincide con cualquiera de las dos palabras; gr(a|e)y coincide con “gray” o “grey”, mientras que gra|ey significaría “gra” o “ey”.
PrácticaAcademia: Grupos y referencias inversas · Jugar: Cazas de alternancia
11 Grupos: captura y nombre
Los paréntesis hacen dos cosas: agrupan tokens para que un cuantificador o | se aplique a todos, y capturan lo que coincidió para reutilizarlo después.
| Sintaxis | Significado |
|---|---|
| (…) | grupo de captura, numerado 1, 2, 3… de izquierda a derecha |
| (?:…) | grupo sin captura: agrupa sin llevar la cuenta |
| (?<name>…) | grupo de captura con nombre |
Usa (?:…) cuando solo necesites agrupar (es más rápido y mantiene ordenados los números de grupo), y nombres cuando un patrón tenga varias capturas que merezcan una etiqueta.
abababababababaPrácticaAcademia: Grupos y referencias inversas · Pack: Patrones con truco · Jugar: Cazas de grupos
12 Referencias inversas
Una referencia inversa coincide con el mismo texto que un grupo ya capturó. \1 se refiere al grupo 1, \2 al grupo 2, \k<name> a un grupo con nombre. Así es como exiges una repetición:
| Sintaxis | Significado |
|---|---|
| (.)\1 | cualquier carácter seguido de sí mismo: una letra doble |
| (.)(.)\2\1 | un palíndromo de 4 caracteres (p. ej., “abba”) |
| (.).*\1 | el mismo carácter aparece otra vez más adelante |
booktreecatsuccessReferencia inversa vs. clase
(.)\1 exige el mismo carácter dos veces, que no es lo mismo que [a-z][a-z] (dos letras cualesquiera). Las referencias inversas son lo que permite a una regex comprobar “lo mismo otra vez”, algo que una clase normal no puede expresar.PrácticaAcademia: Grupos y referencias inversas
13 Lookahead y lookbehind
Un lookaround comprueba que algo aparece (o no) junto a la posición actual sin consumir caracteres: es una condición de ancho cero.
| Sintaxis | Significado |
|---|---|
| (?=…) | lookahead positivo: seguido de … |
| (?!…) | lookahead negativo: no seguido de … |
| (?<=…) | lookbehind positivo: precedido de … |
| (?<!…) | lookbehind negativo: no precedido de … |
Una regla tipo contraseña, “contiene un dígito y una letra”, apila lookaheads al principio: ^(?=.*\d)(?=.*[a-z]).+$. Cada (?=…) revisa toda la cadena desde la posición 0 y luego la coincidencia continúa. En la mayoría de los motores, el lookbehind exige un ancho fijo (o acotado).
16px24 px16ptpxEn el juego (JavaScript)
PrácticaAcademia: Lookarounds · Jugar: Cazas de lookarounds
14 Modificadores
Los modificadores son letras sueltas que cambian cómo coincide todo el patrón, como i para ignorar mayúsculas y minúsculas. En el código van después de la barra de cierre (/cat/gi).
| Sintaxis | Significado |
|---|---|
| i | ignorar mayúsculas y minúsculas |
| g | global: encuentra todas las coincidencias, no solo la primera |
| m | multilínea: ^ y $ coinciden en cada salto de línea |
| s | dotall: . también coincide con saltos de línea |
| u | modo Unicode (activa \u{…} y \p{…}) |
| y | sticky: coincide solo en lastIndex |
| x | extendido/verbose: ignora los espacios y permite comentarios (PCRE/Python; no JS) |
Cat caught a CATcategory15 Unicode y propiedades
Con el modificador u puedes buscar por propiedad Unicode: \p{L} es cualquier letra de cualquier escritura, \p{N} cualquier número, \p{Emoji} un emoji, y \P{…} niega. \u{1F600} coincide con un punto de código por su valor hexadecimal.
Sin u, una regex trabaja con unidades de código UTF-16, así que un emoji u otro carácter astral cuenta como dos “caracteres”, y normalmente no es lo que quieres. Los escapes de propiedades son la forma limpia de manejar texto real.
Compatibilidad entre motores
u), PCRE, Python (con el módulo regex), Java y otros, pero los nombres exactos de las propiedades cambian. Para que sea portable, usa los comunes (L, N, P, nombres de escrituras).16 Patrones comunes
Son patrones cortos y reutilizables para formatos cotidianos: enteros, decimales, correos, colores hexadecimales y fechas ISO. Trata las regex de “validación” como aproximaciones: las reglas reales de un correo o una URL son mucho más enrevesadas que una sola línea.
| Sintaxis | Significado |
|---|---|
| ^\d+$ | un entero no negativo, toda la cadena |
| -?\d+(\.\d+)? | un número decimal con signo opcional |
| ^[\w.+-]+@[\w-]+\.[\w.-]+$ | la forma aproximada de un correo |
| ^#?[0-9a-fA-F]{6}$ | un color hexadecimal de 6 dígitos |
| ^\d{4}-\d{2}-\d{2}$ | una fecha ISO (AAAA-MM-DD) |
PrácticaAcademia: Validadores del mundo real · Jugar: Cazas mixtas
17 Trucos para patrones más cortos
El golf es el arte del patrón más corto que atrapa todos los objetivos y deja libres a todos los inocentes. El tablero solo pregunta “¿coincide en alguna parte?”, así que rara vez necesitas anclas o describir la palabra entera.
- Busca el rasgo distintivo más pequeño. Si todos los objetivos contienen
qy ningún inocente la contiene, la respuesta es simplementeq. - Mejor una clase que una alternancia:
[cb]atgana acat|bat. - Las abreviaturas son cortas:
\den lugar de[0-9],\wen lugar de[A-Za-z0-9_]. - Quita las anclas salvo que un inocente las exija. Añade
^o$solo para excluir una palabra casi idéntica. - Haz opcionales las diferencias con
?en lugar de crear ramas. - Recurre a una referencia inversa cuando los objetivos comparten una repetición que los inocentes no tienen.
Intenta acortar este: cat y bat son objetivos, y “rat” es un inocente:
catbatratmat¿Te animas a competir? La caza del día, los packs de práctica y la Zona de pruebas son el lugar para ponerlo en práctica.
PrácticaAcademia: Técnicas de golf
18 Diferencias entre motores
Las variantes de regex son los dialectos de los distintos motores, y no todas admiten las mismas funciones. Las grandes familias son JavaScript, PCRE (PHP, y cercano a Perl), Python (re / regex) y Java.
| Sintaxis | Significado |
|---|---|
| Lookbehind | JS (ES2018+), PCRE, Python, Java: ancho fijo en la mayoría; PCRE/Python permiten más |
| Posesivo / atómico | PCRE, Java, Python regex; no JavaScript |
Recursión (?R) | solo PCRE y Python regex: ni JS, ni Python re |
| Grupo con nombre | (?<n>) en JS/PCRE/.NET; (?P<n>) en Python clásico |
| x / modificador verbose | PCRE, Python, Java; no JavaScript |
En el juego (JavaScript)
19 Rendimiento y backtracking
La mayoría de las regex son rápidas, pero los cuantificadores anidados sobre los mismos caracteres pueden dispararse. (a+)+$ contra una larga serie de “a” seguida de “!” obliga al motor a probar un número exponencial de divisiones: es el backtracking catastrófico.
- Evita un cuantificador dentro de otro cuantificador que pueda coincidir con lo mismo (
(a+)+,(.*)*). - Haz que las partes internas sean mutuamente excluyentes, para que solo haya una forma de coincidir.
- Ancla con
^/$y prefiere clases concretas a.para reducir el espacio de búsqueda. - En los motores que los tienen, los cuantificadores posesivos y los grupos atómicos eliminan el backtracking por completo.