UltKit

Probador de regex

Escriba un patrón, marque los indicadores que necesite y pegue un texto: cada coincidencia se resalta mientras escribe y aparece en una lista con su posición y sus grupos de captura. El patrón se ejecuta con el propio motor de expresiones regulares de JavaScript de su navegador, así que los resultados coinciden con los de su código y el texto se queda en su dispositivo.

Indicadores

0 caracteres · 0 palabras · 0 líneas

Las coincidencias se resaltan aquí.

0 caracteres · 0 palabras · 0 líneas

Funciona por completo en esta pestaña del navegador. Su texto nunca se sube ni se guarda.

Tokens de regex en JavaScript

La columna de primera coincidencia se obtuvo al ejecutar cada patrón sobre su texto con el motor de JavaScript que generó esta página.

TokenSignificadoPatrónTextoPrimera coincidencia
\dDígito 0–9/\d+/Order 66 shipped66
\wLetra, dígito o guion bajo (ASCII)/\w+/snake_case-idsnake_case
\sEspacio en blanco, incluidas tabulaciones y saltos de línea/\s+/two spaces
.Cualquier carácter salvo un salto de línea (a menos que se use s)/a.c/abc a-cabc
^ $Inicio y fin de la entrada (o de la línea, con m)/^\w+$/singlesingle
[abc]Uno de los caracteres indicados/[aeiou]/rhythm and bluesa
[^abc]Cualquier carácter no indicado/[^0-9]+/2026-10-18-
* + ?0 o más, 1 o más, 0 o 1/colou?r/color colourcolor
{n,m}Entre n y m veces/\d{2,4}/7 42 1999 12345642
(…)Grupo de captura/(\d+)px/width: 320px320px
(?<name>…)Grupo de captura con nombre/(?<h>\d\d):(?<m>\d\d)/at 09:4509:45
(?:…)Grupo sin captura/(?:ab)+/ababab!ababab
a|bCualquiera de los dos lados/cat|dog/hotdogdog
\bLímite de palabra/\bcat\b/concat catcat
(?=…)Seguido de (lookahead)/\d+(?=%)/50 of 75%75
(?<!…)No precedido de (lookbehind negativo)/(?<!\$)\b\d+/$30 or 4040
\p{L}Cualquier letra Unicode (requiere u)/\p{L}+/unaïve 東京naïve

Los seis indicadores de regex y lo que cambian

g (global) encuentra todas las coincidencias en lugar de detenerse en la primera; sin él, la lista tiene una sola entrada. i ignora mayúsculas y minúsculas. m (multilínea) hace que ^ y $ coincidan al principio y al final de cada línea, y no solo de todo el texto, que es lo que se necesita para un patrón como el de espacios al final. s (dotAll, añadido en ES2018) permite que . coincida también con los saltos de línea. u (unicode) trata el texto como puntos de código, de modo que un emoji cuenta como un solo carácter, y habilita los escapes de propiedad como \p{L} para cualquier letra de cualquier escritura. y (sticky) solo coincide exactamente en la posición actual, el modo que usan los analizadores léxicos. JavaScript también tiene d para los índices de coincidencia y v para operaciones de conjuntos en las clases; este probador se limita a los seis anteriores.

Debajo del texto de prueba, cada coincidencia muestra su índice y sus grupos. Los grupos numerados salen de los paréntesis simples, (?:…) agrupa sin capturar y (?<year>\d{4}) crea un grupo con nombre que aparece por su nombre, como muestra el ejemplo de fecha ISO. El menú Patrones comunes inserta puntos de partida ya probados para direcciones de correo electrónico, URL, direcciones IPv4, colores hexadecimales, UUID, palabras repetidas y espacios al final. Tome el patrón de correo como una comprobación básica, no como validación: la gramática completa de las direcciones es mucho más permisiva, y la única prueba real es enviar un mensaje.

Lookbehind y backtracking catastrófico

Los lookarounds comprueban lo que rodea una posición sin consumirlo. El lookahead, (?=…) y (?!…), ha formado parte de JavaScript desde siempre; el lookbehind, (?<=…) y (?<!…), llegó con ES2018 y alcanzó a todos los navegadores principales cuando Safari 16.4 lo incorporó en 2023. Así, (?<=\$)\d+ encuentra 42 en "$42" sin incluir el signo de dólar. A diferencia de muchos otros motores, JavaScript admite lookbehind de cualquier longitud.

El motor de JavaScript funciona por backtracking: cuando un camino falla, retrocede y prueba las alternativas. Los cuantificadores anidados como (a+)+$ le dan un número exponencial de formas de dividir el mismo texto, así que una cadena de 30 letras a seguida de una x puede tardar segundos y unas pocas letras más, horas. Es el backtracking catastrófico, y en los servidores se convierte en ReDoS, una denegación de servicio; una sola regla de WAF con este defecto dejó fuera de servicio la red de Cloudflare durante una media hora el 2 de julio de 2019. Como este probador se ejecuta en su pestaña, un patrón así puede congelar la página; recárguela y reescriba el patrón de modo que dos cuantificadores no puedan reclamar los mismos caracteres, con clases más estrictas como [^,]* en lugar de .*, o con anclas. Para editar el propio texto en lugar de buscar coincidencias, consulte las herramientas de texto; hay más utilidades en la página de herramientas para desarrolladores.

Preguntas frecuentes

¿Por qué mi regex solo encuentra una coincidencia?
El indicador g está desactivado. Sin él, el motor se detiene tras la primera coincidencia. Marque g para listar todas las apariciones; el indicador y por sí solo también encuentra varias, pero solo cuando van una inmediatamente detrás de otra.
¿\d coincide con dígitos de otras escrituras en JavaScript?
No. En JavaScript, \d significa solo de 0 a 9 y \w solo letras ASCII, dígitos y guion bajo, incluso con el indicador u. Para otras escrituras, use \p{Nd} o \p{L} con u.
¿Un patrón regex probado aquí funcionará igual en Python o PHP?
La sintaxis básica se mantiene, pero los detalles cambian: los grupos con nombre de Python se escriben (?P<name>…), PHP y Python admiten cuantificadores posesivos que JavaScript no tiene, y las reglas del lookbehind varían. Vuelva a probarlo en el motor de destino.
¿Cómo se busca con regex un punto o un corchete literal?
Escápelo con una barra invertida: \. coincide con un punto y \[ con un corchete de apertura. Dentro de una clase de caracteres la mayoría de los símbolos ya son literales, así que [.] también coincide solo con un punto.
¿Por qué se congeló la página del probador de regex mientras escribía?
Probablemente el patrón provocó un backtracking catastrófico sobre su texto. Recargue la página y evite cuantificadores anidados como (.*)* o (a+)+, y haga que cada parte coincida con lo mínimo posible.