Probador de expresiones regulares

Prueba expresiones regulares de JavaScript con tu propio texto. Activa las banderas g, i, m, s y u, inspecciona cada coincidencia con su indice y sus grupos, y previsualiza el reemplazo en vivo.

Ve cada coincidencia, cada grupo y cada indice mientras escribes. Introduce un patron y el texto contra el que buscar. Cada resultado se lista con su posicion y sus grupos de captura, los patrones invalidos muestran el mensaje de error del propio motor y el campo de reemplazo ensena exactamente que produciria una llamada a replace.

/ / g
Coincidencias

Leer una expresion regular como lo hace el motor

Las banderas cambian el significado, no solo la busqueda

Las cinco banderas no son preferencias: redefinen el patron. Sin g, una busqueda devuelve la primera coincidencia y para; con ella, el motor mantiene un cursor lastIndex y recorre toda la cadena, que es tambien por lo que una regex global reutilizada entre llamadas parece saltarse coincidencias. La bandera i iguala mayusculas y minusculas usando el mapeo de casos de Unicode, no un simple desplazamiento ASCII.

Las dos peor entendidas son m y s. m cambia solo lo que significan ^ y $, anclandolos a los limites de linea en vez de a toda la cadena; no afecta a .. A la inversa, s cambia solo ., permitiendole coincidir con un salto de linea. El nombre util de recordar es "dotall". La bandera u hace que el patron opere sobre puntos de codigo en lugar de unidades UTF-16, de modo que . casa un emoji como una sola unidad y escapes como \u{1F600} pasan a ser validos. Tambien convierte en error escapes antes tolerados, y por eso un patron existente puede romperse en cuanto la anades.

Grupos, indices y reemplazo

Cada seccion entre parentesis captura por defecto, numerada segun el orden de su parentesis de apertura, y esos numeros son a los que se refieren $1 y $2 en un reemplazo. El anidamiento sigue la misma regla: en ((a)b) el grupo uno es ab y el grupo dos es a. Cuando solo necesitas agrupar para una alternativa o una repeticion, (?:...) evita reservar una captura y mantiene la numeracion legible.

El indice que se muestra en cada coincidencia es el desplazamiento del primer caracter coincidente, y eso importa mas de lo que parece. Permite distinguir dos coincidencias identicas en posiciones distintas, confirmar que un ancla hizo lo esperado y diagnosticar la clasica coincidencia de longitud cero. Un patron como \d* casa la cadena vacia en cualquier sitio, asi que un barrido global encuentra una coincidencia en cada posicion; el motor solo avanza porque las implementaciones fuerzan el cursor hacia delante cuando la coincidencia esta vacia.

Retroceso y limite de coincidencias

La mayoria de motores, incluido el de JavaScript, usan backtracking. Cuando una parte del patron falla, el motor vuelve al ultimo punto de decision y prueba otro camino. Normalmente es invisible. Se vuelve catastrofico cuando los cuantificadores anidados hacen crecer exponencialmente el numero de caminos, con la forma clasica (a+)+b frente a una tirada larga de caracteres a sin ninguna b. Esa entrada puede colgar una pestana, y si el patron viene del usuario se convierte en un vector de denegacion de servicio.

Dos habitos evitan casi todo: prefiere clases de caracteres especificas frente a .* para que las alternativas no se solapen, y ancla los patrones siempre que puedas, ya que un fallo anclado se rechaza de inmediato en lugar de reintentarse en cada desplazamiento. Esta herramienta ademas limita los resultados a 500 coincidencias y avisa cuando trunca, de modo que un patron desbocado degrada a un resultado lento en vez de a una pagina congelada.

Nota de codigo abierto: implementado en JavaScript puro sin librerias de terceros.

Preguntas frecuentes

Que dialecto de regex se usa aqui?
JavaScript, es decir, el motor ECMAScript del navegador. Los patrones de Perl, PCRE y Python son parecidos pero difieren en lookbehind, grupos con nombre y algunos escapes.
Que cambia realmente la bandera g?
Sin ella obtienes solo la primera coincidencia. Con ella el motor recorre toda la cadena y devuelve todas, que es lo que rellena la lista de aqui.
Por que aparecen coincidencias vacias?
Tu patron puede casar cero caracteres, como hace `\d*`. Un barrido global informa entonces de una coincidencia en cada posicion y el motor avanza a mano para no quedarse en bucle.
Como referencio los grupos en el reemplazo?
Usa $1 para el primer grupo, $2 para el segundo y $& para toda la coincidencia. Escribe $$ si necesitas un signo de dolar literal.
Que significa "mostrando las primeras 500"?
La lista se limita a 500 coincidencias para que un patron muy amplio no congele la pagina. La vista previa del reemplazo sigue aplicandose a todo el texto.
Por que mi patron ralentiza la pagina?
Los cuantificadores anidados como (a+)+ provocan retroceso exponencial. Usa clases de caracteres concretas en vez de .* y ancla el patron para que la busqueda sea lineal.