FreeToGenerate.com

100% gratis · sin registro · nada sale de tu navegador

Todo se ejecuta en tu navegador: el patrón y el texto nunca se envían a ningún sitio.

También disponible en: English · Português · Français · العربية

Probador de expresiones regulares (regex online)

Escribe un patrón, pégalo contra tu texto de prueba y mira al instante qué coincide, qué captura y qué queda tras el reemplazo.

¿Qué es un probador de expresiones regulares?

Un probador de expresiones regulares es una página donde escribes un patrón regex y lo enfrentas contra un texto de prueba para ver, al instante, qué coincide. Aquí el campo de patrón acepta tanto una expresión suelta como ^\d+$ como un literal de JavaScript completo pegado tal cual, /^\d+$/gi, y en ese segundo caso la herramienta lee las banderas del final y las activa por ti. Debajo hay ocho interruptores — g, i, m, s, u, v, y, d — que puedes marcar o desmarcar a mano, una caja de texto de prueba y un campo de reemplazo opcional. No hace falta compilar nada ni abrir la consola del navegador: todo pasa en la misma pantalla mientras escribes.

Mientras tecleas, la herramienta muestra el número de coincidencias y cuántos milisegundos tardó la búsqueda, con el texto de prueba resaltado en el punto exacto de cada coincidencia. Debajo aparece una tabla con la posición de cada coincidencia, el texto coincidente, los grupos de captura numerados y los grupos con nombre, y si rellenas el campo de reemplazo también ves el resultado final, con $1, $<nombre> y $& ya resueltos. Es la misma información que normalmente solo consigues intercalando console.log en tu propio código, pero sin escribir ni una línea.

La página también informa de qué funciones recientes de regex admite de verdad el navegador donde la estás leyendo: lookbehind, grupos con nombre, escapes de propiedades Unicode, la bandera d y la bandera v, todo detectado en tiempo de ejecución y no supuesto de antemano. Eso importa porque el soporte de estas funciones varía entre navegadores y versiones, así que lo que ves aquí es lo que tu propio motor puede ejecutar hoy, no una lista genérica sacada de la especificación.

Cómo se usa

  1. Escribe o pega tu patrón. Puedes teclear una expresión suelta como ^\d+$ o pegar un literal de JavaScript completo, /^\d+$/gi: la herramienta detecta las banderas del final y las aplica sola.
  2. Marca las banderas y añade el texto de prueba. Activa g, i, m, s, u, v, y o d según lo que necesites y pega el texto en la caja de prueba; los resultados se recalculan en cada pulsación.
  3. Revisa las coincidencias y, si quieres, define un reemplazo. La tabla te da la posición, el texto coincidente, los grupos numerados y los grupos con nombre de cada coincidencia, junto al número de milisegundos que tardó la búsqueda. Si escribes algo en el campo de reemplazo, con $1, $<nombre> o $&, ves también el resultado final.

Por qué un patrón mal escrito puede tumbar un servidor

Una expresión regular con retroceso catastrófico no es un error que se arregla solo: sencillamente no termina, y una vez que empieza a ejecutarse, nada en ese mismo hilo puede interrumpirla. Ni un temporizador ni una comprobación entre iteraciones sirven, porque el control del programa nunca vuelve a tu código mientras el motor sigue probando combinaciones. El patrón clásico para verlo es /^(a+)+$/ aplicado a una cadena de N letras a seguida de un signo de exclamación: como el signo de exclamación nunca puede coincidir, el motor explora todas las formas posibles de repartir las letras entre los dos cuantificadores anidados antes de rendirse.

Los números lo dejan claro. Medido en el mismo motor de JavaScript que usa Chrome, ese patrón sobre 22 letras a tardó 19 milisegundos; sobre 24, 73 milisegundos; sobre 26, 293; sobre 28, 1.170. Cada letra adicional duplica aproximadamente el trabajo, así que si esa duplicación se mantiene, unas 38 letras tardarían del orden de veinte minutos — es una extrapolación, no algo que hayamos cronometrado. Compáralo con /^a+$/, el mismo trabajo pero sin el cuantificador anidado: sobre 100.000 letras a tardó 0,12 milisegundos. La diferencia no está en el tamaño de la entrada, está en el patrón.

Por eso esta herramienta ejecuta la búsqueda en un Web Worker y no en el hilo principal: es la única forma de demostrar el peligro sin arriesgar nada. Si tu patrón sigue corriendo después de 2 segundos, el worker se detiene y aparece el aviso en lugar de congelarse la pestaña, porque terminar ese hilo desde fuera es la única manera de recuperar el control una vez que el retroceso catastrófico ha empezado. Es exactamente lo que le pasaría a un servidor que use ese mismo patrón contra la entrada de un usuario: la petición no vuelve nunca.

No todos los motores de regex sufren este problema, y no es cuestión de sintaxis sino de diseño. Go y su motor RE2 no admiten retrorreferencias en absoluto, y a cambio quedan inmunes al retroceso catastrófico: esa es precisamente la razón por la que algunos sistemas rechazan esa función, aunque sea muy usada en otros sabores.

Limitaciones honestas

Esta herramienta prueba regex de JavaScript, no una regex genérica: se ejecuta en tu navegador con el motor propio del navegador, así que los resultados son definitivos para JavaScript y solo orientativos para cualquier otro lenguaje. El sabor de JavaScript carece de funciones que sí tienen otros sabores — no hay grupos atómicos, ni cuantificadores posesivos, ni recursión, ni anclas \A o \z, ni condicionales —, así que un patrón copiado de una respuesta pensada para PCRE, Python o Perl puede simplemente no compilar aquí.

La bandera u tampoco te da caracteres en el sentido en que los entiende un lector. Medido: el punto sin la bandera u coincide con unidades UTF-16, así que el emoji del pulgar hacia arriba cuenta como 2 coincidencias; con u activada cuenta como 1. Pero el emoji de familia — hombre, mujer, niña y niño unidos — son 7 puntos de código distintos y sigue siendo un solo grupo de grafemas para quien lo lee, así que ni siquiera con u estás contando lo que parece un carácter en pantalla.

\d y \w tampoco hacen lo que uno esperaría fuera del inglés. \d en JavaScript es solo ASCII: no coincide con dígitos árabes orientales como ٣٤, mientras que \p{Nd} con la bandera u sí lo hace. En español el problema no está tanto en \d como en \w: \w no incluye la ñ ni las vocales acentuadas, así que un patrón tan sencillo como \w+ parte palabras como año o acción por la mitad.

Hay además tres límites prácticos que conviene conocer. Una regex con la bandera g guarda una propiedad lastIndex entre llamadas, así que invocar .test() varias veces seguidas sobre la misma cadena con el mismo objeto puede devolver true, luego false, luego true, luego false — es un fallo con el que casi todo el mundo tropieza alguna vez. Un patrón que puede coincidir con la cadena vacía, como /a*/g, no avanza la posición por sí solo en una coincidencia vacía, así que haría falta avanzarla a mano (y por un punto de código completo con la bandera u, o quedarse atrapado entre las dos mitades de un par suplente). Por último, la lista de coincidencias se corta en las primeras 1000 y cualquier búsqueda que siga corriendo pasados 2 segundos se detiene automáticamente.

¿Por qué es gratis?

Esta herramienta es gratis porque todo el trabajo lo hace el dispositivo que la está leyendo, no un servidor nuestro. El patrón, el texto de prueba y el reemplazo se procesan en tu navegador — dentro de un Web Worker, como ya se ha explicado —, así que no hay nada que enviar ni que almacenar en ningún sitio.

No hace falta crear una cuenta, no hay marca de agua en el resultado y no se sube ningún archivo: copias tu texto, lo pegas, y lo que sale es tuyo desde el primer momento. FreeToGenerate.com vive de mantener herramientas así de simples y gratuitas, no de convertirlas en un embudo hacia un plan de pago.