Probador de regex y constructorBeta

Prueba y explica regex, o créalas con bloques

Esta herramienta es una versión beta que aún se está estabilizando. Avísanos si un resultado no parece correcto.

Prueba y explica regex, o créalas con bloques

//

Flags
Patrones habituales

Detalle de coincidencias

Explicación del patrón

    Cadenas que esta regex puede generar

    Cadenas aleatorias que coinciden con tu patrón actual: una forma rápida de comprobar que hace lo que pretendes (sin anclas, puede haber coincidencias parciales).

      Vista previa de reemplazo
      Resultado
      Crear una regex a partir de ejemplos

      Escribe un ejemplo por línea. Crearemos un borrador de regex que coincida con todos: un punto de partida, no un patrón terminado.

      Acerca de Probador de regex y constructor

      Esta herramienta compila tu patrón con el propio new RegExp(patrón, flags) del navegador, así que todos los resultados corresponden al motor de expresiones regulares de JavaScript (ECMAScript). El mismo patrón puede comportarse de otra forma en Python, Java, PCRE (PHP) o grep; si lo vas a usar en otro lenguaje, revisa primero las diferencias de abajo.

      Hay dos modos. El modo de prueba muestra las coincidencias, los grupos de captura y una vista previa del reemplazo, y descompone el patrón en piezas explicadas. El modo constructor permite apilar bloques como 'dígitos' o 'texto literal', o pegar cadenas de ejemplo, para obtener un primer borrador del patrón.

      En qué se diferencia la regex de JavaScript

      • Sin el flag g solo obtienes la primera coincidencia; la herramienta lo indica. Actívalo para el equivalente de re.findall de Python.
      • Los grupos con nombre se escriben (?<nombre>...); en el reemplazo se usa $<nombre>, $1 para los numerados y $& para la coincidencia completa. El módulo re de Python usa (?P<nombre>...) y \g<nombre>.
      • El lookbehind, (?<=...) y (?<!...), admite patrones de longitud variable. re de Python solo acepta longitud fija. Safari fue el último navegador importante en incorporarlo, en marzo de 2023 (Safari 16.4); en iPhones más antiguos un literal con lookbehind es un error de sintaxis que impide cargar todo el script.
      • JavaScript no tiene grupos atómicos (?>...) ni cuantificadores posesivos como a++, que sí ofrecen PCRE y Java. Es una herramienta menos para evitar el problema de retroceso descrito más abajo.
      • \d, \w y \b solo entienden ASCII, incluso con el flag u. \w equivale a [A-Za-z0-9_], así que á, é, ñ o ü cuentan como caracteres que no son de palabra. Para texto en español esto importa mucho más de lo que parece.

      Qué cambia el flag u

      Sin u, una cadena de JavaScript se trata como unidades de código UTF-16. El emoji 😀 ocupa dos unidades, así que ^.$ no coincide; con u coincide como un solo carácter. Los escapes de propiedad Unicode, como \p{L} o \p{Script=Latin}, solo tienen sentido con u (o v). Sin el flag, \p se lee como una simple letra p y \p{L}+ acaba coincidiendo con cadenas raras como 'p{L}}}'.

      También cambia la búsqueda sin distinguir mayúsculas. Sin u, la s larga (ſ, U+017F) no se considera variante de s; con u se aplica el plegado de mayúsculas de Unicode y coincide. Para buscar palabras en español, [\p{L}]+ con u es mucho más fiable que \w+: sobre 'café naïve' \w+ devuelve 'caf', 'na' y 've'.

      Retroceso catastrófico, medido

      El motor de JavaScript funciona por retroceso (backtracking): cuando una coincidencia falla, vuelve atrás y cambia decisiones anteriores. Si das a ^(a+)+$ una cadena de aes terminada en !, el motor prueba todas las formas de repartir las aes entre la repetición interior y la exterior antes de rendirse, y su número casi se duplica con cada a adicional.

      Ejecutando el código de esta herramienta en Node.js (V8) se obtuvieron estos tiempos: 24 aes más ! tardaron unos 66 ms; 26, unos 254 ms; 28, unos 958 ms; y 30, unos 3,9 segundos. El patrón lineal ^a+$ con 10.000 aes terminó en menos de 0,1 ms. Los valores absolutos dependen del equipo, pero la forma, cuatro veces más lento por cada dos caracteres, se mantiene.

      La herramienta ejecuta la búsqueda en un Web Worker y lo detiene si no termina en 250 ms, mostrando un aviso de que tardó demasiado, así que la página nunca se congela. El código de servidor no suele tener esa protección, y una sola petición preparada puede acaparar un núcleo de CPU: eso es ReDoS. La solución es eliminar la ambigüedad reescribiendo los cuantificadores anidados para que la cadena solo pueda dividirse de una manera. (a+)+ pasa a ser a+, y (\w+\s?)+ pasa a ser \w+(?:\s\w+)*.

      Crear un borrador en el modo constructor

      El constructor permite grupos anidados un solo nivel, suficiente para teléfonos, fechas o códigos de producto. Si pegas varias líneas de ejemplo busca una estructura común: con 010-1234-5678 y 010-9876-5432 genera ^\d{3}-\d{4}-\d{4}$. Un borrador ajustado a ejemplos puede quedarse corto o pasarse, así que en el modo de prueba comprueba también cadenas que no deberían coincidir.

      Ejemplos

      Extraer importes con lookbehind

      Entrada
      Patrón (?<=\$)\d+(?:\.\d{2})? flags g Texto Total $19.99, tax $1.60, 30 items
      Resultado
      19.99, 1.60 (2 coincidencias)

      Solo coinciden los números precedidos de $, y el $ no forma parte de la coincidencia. 30 no lleva $ delante.

      Cuando \b no reconoce la é

      Entrada
      Patrón \bcafé\b flags g Texto café cafés
      Resultado
      1 coincidencia: el café dentro de cafés

      Como é no es carácter de palabra, no hay límite entre la é y el espacio en 'café ', pero sí entre la é y la s en 'cafés'. Justo lo contrario de lo que se espera.

      Reordenar una fecha con grupos con nombre

      Entrada
      Patrón (?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2}) reemplazo $<d>/$<m>/$<y> Texto 2026-09-22
      Resultado
      22/09/2026 (1 reemplazo)

      Con nombres en vez de números, añadir otro grupo más adelante no rompe el reemplazo.

      Cómo se usa

      1. Escribe el patrón y los flags, o elige uno de la lista de patrones comunes.
      2. Pega el texto de prueba y revisa coincidencias y grupos de captura.
      3. Si quieres, escribe un reemplazo para ver el resultado.
      4. Si no conoces la sintaxis, crea un borrador en el modo constructor.

      Preguntas frecuentes

      Aquí funciona pero en Python falla.

      Cambia (?<nombre>) por (?P<nombre>), haz que los lookbehind tengan longitud fija y usa \1 en lugar de $1 en los reemplazos.

      Aparece el aviso de que tardó demasiado.

      Es retroceso catastrófico. Busca cuantificadores anidados que puedan dividir el mismo texto de varias formas, como (x+)+ o (x|x)*, y simplifícalos.

      ¿Por qué \w no reconoce la ñ ni las tildes?

      En JavaScript \w solo incluye letras y dígitos ASCII y el guion bajo. Usa el flag u con \p{L}.

      Un emoji cuenta como dos caracteres.

      Activa el flag u. Sin él, el motor cuenta unidades UTF-16 y separa los pares sustitutos.

      Fuentes

      Revisado el:

      Privacidad y tratamiento de datos