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
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).
Algunas combinaciones no coincidían con la regex y se descartaron.
Vista previa de reemplazo
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.
Cargando…
Procesando…
0.0
No se ha bloqueado: el resultado aparecerá cuando termine el cálculo.
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
- Escribe el patrón y los flags, o elige uno de la lista de patrones comunes.
- Pega el texto de prueba y revisa coincidencias y grupos de captura.
- Si quieres, escribe un reemplazo para ver el resultado.
- 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
- MDN: Expresiones regulares (JavaScript)
- MDN: Lookbehind assertion
- MDN: Unicode character class escape
- OWASP: Regular expression Denial of Service (ReDoS)
- Python docs: re
Revisado el: