Saltar al contenido

Chuleta de regex

Las expresiones regulares son lo bastante compactas como para que su sintaxis sea más fácil de consultar que de memorizar. Esta página es toda ella en una sola pantalla —clases, cuantificadores, anclas, grupos, lookaround, escapado y los flags— con un ejemplo funcional para cada fila.

El sabor es JavaScript, que es lo que se ejecuta en tu navegador y lo que usa el probador de regex de este sitio. La mayor parte es idéntica en Python, Java, Go y PCRE; donde los sabores divergen, lo hacen en los bordes: el soporte de lookbehind, la sintaxis de los grupos con nombre y si \d significa «dígito ASCII» o «cualquier dígito Unicode».

Dos cosas explican la mayoría de las sorpresas. Los cuantificadores son voraces: toman todo lo que pueden y solo devuelven cuando el resto del patrón falla, y por eso <.+> se traga dos etiquetas y <.+?> no. Y la alternación es la que liga más débilmente de todo, así que ^a|b$ significa «empieza por a, o termina en b», no lo que la mayoría pretende al escribirlo.

Clases de caracteres

11

Las abreviaturas son solo ASCII a menos que añadas el flag u y uses escapes de propiedad Unicode.

SintaxisSignificadoEjemplo
.Cualquier carácter excepto un salto de líneaAñade el flag s para que coincida también con los saltos de línea./a.c/"abc" "abc"
\dUn dígito, 0–9/\d+/"order 42" "42"
\DCualquier cosa que no sea un dígito/\D+/"42abc" "abc"
\wLetra, dígito o guion bajoSolo ASCII: «é» no es \w./\w+/"user_1!" "user_1"
\WCualquier cosa con la que \w no coincida/\W+/"a++b" "++"
\sCualquier espacio en blanco, incluidos tabulaciones y saltos de línea/\s+/"a \t b" " \t "
\SCualquier carácter que no sea espacio en blanco/\S+/" hi" "hi"
[abc]Cualquiera de los caracteres indicados/[aeiou]/"rhythm and" "a"
[^abc]Cualquier carácter excepto los indicados/[^aeiou ]+/"aeiou xyz" "xyz"
[a-z]Un rango de caracteres/[a-f]+/"zzabcz" "abc"
\p{L}Cualquier letra Unicode (necesita el flag u)/\p{L}+/"42 café" "café"

Cuantificadores

7

Todos ellos son voraces por defecto: toman tanto como pueden y solo devuelven si el resto del patrón falla.

SintaxisSignificadoEjemplo
*Cero o más/ab*/"a" "a"
+Uno o más/ab+/"abbb" "abbb"
?Cero o uno — lo hace opcional/colou?r/"color" "color"
{3}Exactamente tres/\d{3}/"id 12345" "123"
{2,}Dos o más/a{2,}/"aaa" "aaa"
{2,4}Entre dos y cuatro/a{2,4}/"aaaaa" "aaaa"
*?Perezoso — toma lo menos posibleEl voraz <.+> se tragaría ambas etiquetas./<.+?>/"<a><b>" "<a>"

Anclas y límites

4

Estos coinciden con una posición, no con un carácter, así que no consumen nada.

SintaxisSignificadoEjemplo
^Inicio de la cadena, o de una línea con el flag m/^a/"abc" "a"
$Fin de la cadena, o de una línea con el flag m/c$/"abc" "c"
\bUn límite de palabraEsto es lo que impide que «cat» coincida dentro de «concatenate»./\bcat\b/"the cat sat" "cat"
\BNo es un límite de palabra/\Bcat/"concatenate" "cat"

Grupos y alternación

5
SintaxisSignificadoEjemplo
(abc)Grupo de captura — recordado para el reemplazo/(\d+)-(\d+)/"10-20" "10-20"
(?:abc)Agrupar sin capturarUsa esto cuando solo necesitas la agrupación; mantiene con sentido los números de captura./(?:ab)+/"abab" "abab"
(?<name>…)Grupo de captura con nombre/(?<year>\d{4})/"in 2026" "2026"
a|bUno u otro lado — alternaciónLa alternación tiene la precedencia más baja: ^a|b$ es «^a» o «b$», no «^(a|b)$»./cat|dog/"one dog" "dog"
\1Retrorreferencia al primer grupo/(\w)\1/"letter" "tt"

Lookaround

4

Aserciones sobre lo que rodea a una posición. Ellas mismas no coinciden con nada, que es lo que las hace seguras de combinar.

SintaxisSignificadoEjemplo
(?=…)Lookahead — seguido de esto/\d+(?= kg)/"80 kg" "80"
(?!…)Lookahead negativo — no seguido de esto/\d+(?! kg)/"80 lb" "80"
(?<=…)Lookbehind — precedido de esto/(?<=\$)\d+/"costs $40" "40"
(?<!…)Lookbehind negativo — no precedido de esto/(?<!\$)\b\d+/"about 40" "40"

Escapado

5

Estos doce caracteres son los que necesitan una barra invertida para tomarse de forma literal.

SintaxisSignificadoEjemplo
\.Un punto literal/\d\.\d/"v2.5" "2.5"
\\Una barra invertida literal/\\/"C:\\dir" "\\"
\nUn salto de línea/a\nb/"a\nb" "a\nb"
\tUna tabulación/a\tb/"a\tb" "a\tb"
\uFFFFUn carácter por su punto de código/\u00e9/"café" "é"

Flags

6
FlagNombreSignificado
gGlobalEncuentra todas las coincidencias, no solo la primera.
iIgnorar mayúsculas/minúsculasCoincide sin importar mayúsculas o minúsculas.
mMultilíneaHace que ^ y $ coincidan en cada salto de línea en lugar de solo en los extremos de la cadena.
sDot allPermite que . coincida también con los saltos de línea.
uUnicodeTrata el patrón como puntos de código y habilita los escapes de propiedad \p{…}.
yStickyCoincide únicamente en lastIndex exacto, sin buscar hacia adelante.

Preguntas frecuentes

¿Cuál es la diferencia entre cuantificadores voraces y perezosos?
Los cuantificadores voraces (*, +, {2,}) coinciden con todo lo posible y solo devuelven caracteres cuando el resto del patrón no puede coincidir. Añadir ? los hace perezosos: coinciden con lo menos posible y toman más solo cuando se les obliga. En «<a><b>», el patrón <.+> devuelve toda la cadena y <.+?> devuelve solo <a>.
¿Por qué mi palabra coincide dentro de otras palabras?
Porque nada la anclaba. Envuelve la palabra en \b: /\bcat\b/ coincide con «cat» en «the cat sat» pero no dentro de «concatenate». \b coincide con una posición entre un carácter de palabra y uno que no lo es, así que no consume nada.
¿Qué cambia el flag u?
Hace que el patrón opere sobre puntos de código en lugar de unidades UTF-16, de modo que un solo emoji cuenta como un carácter, y habilita los escapes de propiedad \p{…} como \p{L} para «cualquier letra». Sin él, \w y \d siguen siendo solo ASCII, y por eso «café» no coincide del todo con /\w+/.
¿Cuándo debo usar un grupo sin captura?
Siempre que necesites la agrupación pero no el texto capturado: (?:ab)+ en lugar de (ab)+. Las capturas cuestan un poco de rendimiento, pero la verdadera razón es la numeración: cada grupo de captura que añades desplaza los números de los que van después, rompiendo silenciosamente los reemplazos que usan $1 y $2.
¿Es seguro usar lookbehind?
En los navegadores actuales y en Node, sí: (?<=…) y (?<!…) están soportados en todos los motores importantes desde 2018. Safari fue el último en añadirlo. Si tu objetivo son entornos de ejecución muy antiguos, comprueba antes; no hay polyfill para la sintaxis de regex.