Saltar al contenido
TextArray

Hoja de trucos de expresiones regulares

Las expresiones regulares son lo suficientemente compactas como para que la sintaxis sea más fácil de buscar que de memorizar. Esta página lo contiene todo en una sola pantalla (clases, cuantificadores, anclas, grupos, búsqueda, escape y banderas) con un ejemplo práctico para cada fila.

El tipo es JavaScript, que es lo que se ejecuta en su navegador y lo que utiliza el probador de expresiones regulares de este sitio. La mayor parte es idéntica en Python, Java, Go y PCRE; donde los sabores divergen, divergen en los bordes: soporte de búsqueda hacia atrás, sintaxis de grupo 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 codiciosos: toman todo lo que pueden y lo devuelven sólo cuando el resto del patrón falla, razón por la cual <.+> se traga dos etiquetas y <.+?> no. Y la alternancia es la que menos vincula, por lo que ^a|b$ significa "comienza con a o termina con b", no es lo que la mayoría de la gente pretende cuando lo escribe.

Clases de personajes

Las abreviaturas son solo ASCII a menos que agregue el indicador u y use escapes de propiedades Unicode.

SintaxisSignificadoEjemplo
.Cualquier carácter excepto un salto de líneaAgregue la bandera s para que también coincida con las nuevas líneas./a.c/"abc" → "abc"
\dUn dígito, 0–9/\d+/"order 42" → "42"
\DTodo lo que no sea un dígito/\D+/"42abc" → "abc"
\wLetra, dígito o guión bajoSólo ASCII: "é" no es \w./\w+/"user_1!" → "user_1"
\WCualquier cosa \w no coincide/\W+/"a++b" → "++"
\sCualquier espacio en blanco, incluidas pestañas y nuevas líneas./\s+/"a \t b" → " \t "
\SCualquier carácter que no sea un espacio en blanco/\S+/" hi" → "hi"
[abc]Cualquiera de los personajes enumerados/[aeiou]/"rhythm and" → "a"
[^abc]Cualquier personaje excepto los listados./[^aeiou ]+/"aeiou xyz" → "xyz"
[a-z]Una variedad de personajes/[a-f]+/"zzabcz" → "abc"
\p{L}Cualquier letra Unicode (necesita la bandera u)/\p{L}+/"42 café" → "café"

Cuantificadores

Todos ellos son codiciosos por defecto: toman todo lo que pueden y devuelven sólo 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 codicioso <.+> se tragaría ambas etiquetas./<.+?>/"<a><b>" → "<a>"

Anclas y límites

Estos coinciden con una posición, no con un personaje, por lo que no consumen nada.

SintaxisSignificadoEjemplo
^Inicio de la cadena, o de una línea con la bandera m/^a/"abc" → "a"
$Fin de la cadena, o de una línea con la bandera m/c$/"abc" → "c"
\bUn límite de palabrasEsto es lo que impide que "gato" coincida dentro de "concatenar"./\bcat\b/"the cat sat" → "cat"
\BNo hay límite de palabras/\Bcat/"concatenate" → "cat"

Grupos y alternancia

SintaxisSignificadoEjemplo
(abc)Grupo de captura: recordado para reemplazo/(\d+)-(\d+)/"10-20" → "10-20"
(?:abc)Agrupar sin capturarUtilízalo cuando sólo necesites la agrupación; mantiene los números de captura significativos./(?:ab)+/"abab" → "abab"
(?<name>…)Grupo de captura con nombre/(?<year>\d{4})/"in 2026" → "2026"
a|bCualquiera de los dos lados: alternanciaLa alternancia tiene la prioridad más baja: ^a|b$ es "^a" o "b$", no "^(a|b)$"./cat|dog/"one dog" → "dog"
\1Referencia al primer grupo/(\w)\1/"letter" → "tt"

Mirar a tu alrededor

Afirmaciones sobre lo que rodea a un cargo. No combinan con nada en sí mismos, lo que los hace seguros para combinar.

SintaxisSignificadoEjemplo
(?=…)Lookahead - seguido de esto/\d+(?= kg)/"80 kg" → "80"
(?!…)Previsión negativa: no seguida de esto/\d+(?! kg)/"80 lb" → "80"
(?<=…)Mirar hacia atrás: precedido por esto/(?<=\$)\d+/"costs $40" → "40"
(?<!…)Mirada hacia atrás negativa, no precedida por esto/(?<!\$)\b\d+/"about 40" → "40"

Escapando

Estos doce caracteres son los que necesitan una barra invertida para ser tomados literalmente.

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 pestaña/a\tb/"a\tb" → "a\tb"
\uFFFFUn carácter por su punto de código/\u00e9/"café" → "é"

Banderas

BanderaNombreSignificado
gGlobalEncuentra todas las coincidencias, no solo la primera.
iignorar casoCoincide independientemente de 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.
sPunto todoVamos. La línea de coincidencia también se rompe.
uUnicódigoTrata el patrón como puntos de código y habilita los escapes de propiedad \p{...}.
yPegajosoCoincide solo exactamente con el último índice, nunca busca hacia adelante.

Preguntas frecuentes

¿Cuál es la diferencia entre cuantificadores codiciosos y perezosos?
Los cuantificadores codiciosos (*, +, {2,}) coinciden tanto como sea posible y devuelven caracteres sólo cuando el resto del patrón no puede coincidir. ¿Agregando? Los vuelve perezosos: combinan lo menos posible y toman más sólo cuando se les obliga. En "<a><b>", el patrón <.+> devuelve la cadena completa y <.+?> devuelve solo <a>.
¿Por qué mi palabra coincide dentro de otras palabras?
Porque nada lo ancló. Envuelva la palabra en \b — /\bcat\b/ coincide con "gato" en "el gato se sentó" pero no dentro de "concatenar". \b coincide con una posición entre un carácter de palabra y uno que no es de palabra, por lo que no consume nada.
¿Qué cambia la bandera u?
Hace que el patrón opere en puntos de código en lugar de unidades UTF-16, por lo que un solo emoji cuenta como un carácter y habilita \p{...} escapes de propiedad como \p{L} para "cualquier letra". Sin él, \w y \d permanecen solo en ASCII, razón por la cual "café" no coincide completamente con /\w+/.
¿Cuándo debo utilizar un grupo sin captura?
Siempre que necesite 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 agrega cambia los números de los que le siguen, rompiendo silenciosamente los reemplazos que usan $1 y $2.
¿Es seguro usar la búsqueda hacia atrás?
En los navegadores actuales y en Node, sí, (?<=…) y (?<!…) han sido compatibles con todos los motores principales desde 2018. Safari fue el último en agregarlo. Si su objetivo son tiempos de ejecución muy antiguos, verifique primero; no hay polyfill para la sintaxis de expresiones regulares.