Probador Regex
Probar expresiones regulares en vivo
Las expresiones regulares (regex) son patrones que coinciden con texto. Se usan en todas partes: validacion de entradas, buscar/reemplazar, analisis de logs. Sintaxis densa pero fácil de aprender.
¿Qué es Regex?
Una expresión regular (regex o regexp) es una secuencia de caracteres que define un patrón de búsqueda. Los patrones regex describen cómo se ve el texto en lugar de lo que significa: coinciden con secuencias de caracteres, no con semántica.
Las expresiones regulares son una de las herramientas más potentes y omnipresentes en programación. Aparecen en prácticamente todos los lenguajes de programación (JavaScript, Python, Java, Go, Rust), todos los editores de texto (VS Code, Vim, Sublime), todas las herramientas de línea de comandos (grep, sed, awk) y la mayoría de bases de datos (PostgreSQL, MySQL). Aprender regex es un multiplicador de fuerza: la misma sintaxis funciona casi en todas partes.
La contrapartida es la legibilidad. Los patrones regex son densos y pueden parecer crípticos a primera vista. Un patrón como ^(?=.*[A-Z])(?=.*\d)[A-Za-z\d@$!%*?&]{8,}$ es perfectamente lógico una vez que conoces la sintaxis, pero impenetrable si no la conoces. La clave está en aprender los bloques fundamentales uno a uno.
Conceptos fundamentales
Clases de caracteres
Una clase de caracteres coincide con cualquier carácter individual de un conjunto definido:
[abc]— Coincide cona,boc[a-z]— Coincide con cualquier letra minúscula[^abc]— Coincide con cualquier carácter exceptoa,boc.— Coincide con cualquier carácter excepto salto de línea
Clases abreviadas
| Abreviatura | Equivalente | Significado |
|---|---|---|
\d | [0-9] | Cualquier dígito |
\D | [^0-9] | Cualquier no-dígito |
\w | [a-zA-Z0-9_] | Cualquier carácter de palabra |
\W | [^a-zA-Z0-9_] | Cualquier carácter que no sea de palabra |
\s | [ \t\n\r\f\v] | Cualquier espacio en blanco |
\S | [^ \t\n\r\f\v] | Cualquier no-espacio en blanco |
Cuantificadores
Los cuantificadores especifican cuántas veces debe repetirse un patrón:
| Cuantificador | Significado | Ejemplo |
|---|---|---|
* | 0 o más | a* coincide con "", "a", "aaa" |
+ | 1 o más | a+ coincide con "a", "aaa" pero no con "" |
? | 0 o 1 | a? coincide con "" o "a" |
{n} | Exactamente n | a{3} coincide con "aaa" |
{n,m} | Entre n y m | a{2,4} coincide con "aa", "aaa", "aaaa" |
{n,} | n o más | a{2,} coincide con "aa", "aaa", … |
Anclas
Las anclas coinciden con posiciones, no con caracteres:
^— Inicio de cadena (o de línea en modo multilínea)$— Fin de cadena (o de línea en modo multilínea)\b— Límite de palabra (entre\wy\W)
Grupos y alternancia
(abc)— Grupo de captura: coincide conabcy lo captura para referencias posteriores(?:abc)— Grupo sin captura: coincide conabcsin capturarloa|b— Alternancia: coincide conaob
Hoja de referencia de Regex
| Sintaxis | Nombre | Descripción |
|---|---|---|
. | Punto | Cualquier carácter (excepto salto de línea) |
\d | Dígito | [0-9] |
\w | Palabra | [a-zA-Z0-9_] |
\s | Espacio | Espacio, tabulación, salto de línea |
* | Asterisco | 0 o más (codicioso) |
+ | Más | 1 o más (codicioso) |
? | Interrogación | 0 o 1 (opcional) |
{n,m} | Rango | Entre n y m repeticiones |
() | Grupo | Grupo de captura |
[] | Clase | Clase de caracteres |
^ | Circunflejo | Inicio de cadena/línea |
$ | Dólar | Fin de cadena/línea |
| | Barra | Alternancia (OR) |
(?=) | Lookahead | Afirma lo que sigue |
(?<=) | Lookbehind | Afirma lo que precede |
Lookahead y Lookbehind
Lookahead y lookbehind son aserciones de ancho cero: verifican si un patrón existe antes o después de la posición actual sin consumir caracteres.
Lookahead positivo (?=...) afirma que lo que sigue coincide con un patrón. Por ejemplo, \d+(?= USD) coincide con dígitos solo si van seguidos de USD: coincide con 100 en “100 USD” pero no en “100 EUR”.
Lookahead negativo (?!...) afirma que lo que sigue no coincide. \d+(?! USD) coincide con dígitos que no van seguidos de USD.
Lookbehind positivo (?<=...) afirma que lo que precede coincide. (?<=\$)\d+ coincide con dígitos precedidos por $: coincide con 50 en “$50” pero no en “50”.
Lookbehind negativo (?<!...) afirma que lo que precede no coincide.
Los lookarounds son de ancho cero: verifican el contexto sin consumir caracteres, por lo que el texto coincidente no incluye el propio patrón del lookaround.
Patrones comunes
Estos son patrones probados en batalla para tareas de validación frecuentes:
- Email (básico):
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ - URL:
https?://[^\s/$.?#].[^\s]* - IPv4:
^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$ - Fecha (YYYY-MM-DD):
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$ - Teléfono (internacional):
^\+?[1-9]\d{1,14}$ - Color hexadecimal:
^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$
Casos de uso comunes
- Validación de entradas: Verificar que los campos de formulario contengan emails, números de teléfono, códigos postales o identificadores válidos antes del envío
- Buscar y reemplazar: Encontrar y transformar patrones en bases de código: renombrar variables, actualizar importaciones, reformatear datos
- Análisis de logs: Extraer marcas de tiempo, direcciones IP, códigos de error y trazas de pila de archivos de log no estructurados
- Extracción de datos: Extraer datos estructurados de texto semiestructurado como correos electrónicos, PDF o HTML
- Enrutamiento de URL: Los frameworks web usan patrones regex para asignar URLs a funciones manejadoras
Prueba estos ejemplos
Este patrón coincide con direcciones de correo electrónico estándar como user@example.com. Verifica una parte local (letras, dígitos, puntos, guiones bajos), un símbolo @, un nombre de dominio y un TLD de al menos 2 caracteres.
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ Esta cadena tiene doble @ y puntos consecutivos, que la regex de email rechaza. El patrón requiere exactamente un @ y no permite puntos consecutivos en el dominio.
user@@example..com