Expresiones regulares: ejemplos, tablas de sintaxis y patrones listos
Sintaxis de regex en tablas y patrones probados antes de publicarse.
Sin registro, sin rastreoUna expresión regular es un pequeño lenguaje de patrones para describir texto. Su sintaxis es densa a propósito —cada carácter se gana su lugar—, lo que la vuelve rápida de escribir y genuinamente difícil de recordar de una vez a otra.
Esta es la versión de consulta: siete tablas con la sintaxis que de verdad usas, ejemplos comentados de cada concepto y un conjunto de patrones listos para copiar. Todos los patrones de esta página se ejecutaron contra entradas válidas e inválidas antes de publicarse, y las descripciones siguen la referencia de expresiones regulares de MDN.
Metacaracteres
| Símbolo | Significado |
|---|---|
| . | Cualquier carácter excepto un salto de línea |
| \ | Escapa el siguiente carácter para tomarlo literal |
| | | Alternancia — coincide con el lado izquierdo o el derecho |
| [ ] | Clase de caracteres — coincide con un carácter del conjunto |
| [^ ] | Clase negada — coincide con un carácter que no esté en el conjunto |
| ( ) | Grupo de captura |
| { } | Cantidad explícita de repeticiones |
Estos son los caracteres que no se representan a sí mismos. Si necesitas buscar uno de ellos de forma literal, ponle una barra invertida delante: \. busca un punto de verdad, mientras que . sin escapar busca cualquier carácter. Es el fallo número uno al escribir patrones para dominios y archivos.
Cuantificadores
| Símbolo | Significado | Ejemplo |
|---|---|---|
| * | Cero o más | a* |
| + | Uno o más | a+ |
| ? | Cero o uno (opcional) | a? |
| {n} | Exactamente n veces | \d{4} |
| {n,} | n veces o más | \d{2,} |
| {n,m} | Entre n y m veces | \d{2,4} |
| *? +? ?? {n,m}? | Perezoso: coincide lo menos posible | <.+?> |
Los cuantificadores son voraces por defecto: agarran todo lo que pueden y luego van devolviendo caracteres hasta que el resto del patrón encaje. Al agregarles ? se vuelven perezosos. Contra la entrada <a><b>, el patrón <.+> coincide con toda la cadena, mientras que <.+?> coincide solo con <a>. Esa única diferencia está detrás de casi todas las preguntas del tipo «por qué mi expresión se comió la línea entera».
Clases de caracteres
| Símbolo | Coincide con |
|---|---|
| \d | Un dígito, del 0 al 9 |
| \D | Cualquier cosa que no sea un dígito |
| \w | Carácter de palabra: A-Z, a-z, 0-9 y guion bajo |
| \W | Cualquier cosa que no sea carácter de palabra |
| \s | Espacio en blanco: espacio, tabulador, salto de línea, retorno de carro |
| \S | Cualquier cosa que no sea espacio en blanco |
| [a-z] | Rango — cualquier letra minúscula |
| [^0-9] | Cualquier carácter excepto un dígito |
| \p{L} | Cualquier letra Unicode — requiere la bandera u |
| \P{L} | Cualquier carácter que no sea letra Unicode |
Cuidado con el español aquí: en JavaScript \w es solo ASCII, así que no incluye ñ, á ni ü. Un patrón como ^\w+$ rechaza «mañana». Si trabajas con texto en español, usa ^\p{L}+$ con la bandera u, o agrega los caracteres a mano con [a-zA-ZáéíóúüñÁÉÍÓÚÜÑ]. En Python el comportamiento es el contrario: \w sí incluye Unicode en cadenas str salvo que pases re.ASCII.
Anclas y límites
| Símbolo | Afirma |
|---|---|
| ^ | Inicio de la entrada, o inicio de línea con la bandera m |
| $ | Fin de la entrada, o fin de línea con la bandera m |
| \b | Límite de palabra — el borde entre \w y \W |
| \B | Donde no hay límite de palabra |
Las anclas coinciden con una posición, no con un carácter, así que no consumen nada. \bgato\b encuentra la palabra gato en «gato regato» una sola vez, porque el gato dentro de regato tiene un carácter de palabra a su izquierda. Usar ^ y $ es además la forma de exigir que el patrón cubra toda la cadena y no un pedazo: sin anclas, ^\d{4}$ y \d{4} dan resultados muy distintos.
Grupos, alternancia y retrorreferencias
| Símbolo | Significado |
|---|---|
| ( ... ) | Grupo de captura, se referencia por número |
| (?: ... ) | Grupo sin captura — agrupa sin capturar |
| (?<name> ... ) | Grupo de captura con nombre |
| \1, \2 | Retrorreferencia al grupo de captura 1, 2 ... |
| \k<name> | Retrorreferencia a un grupo con nombre |
/(?<anio>\d{4})-(?<mes>\d{2})/ grupos con nombre: .groups.anio da "2026"
/(?:ab)+(c)/ el grupo 1 es "c": (?: ...) no captura
/\b(\w+)\s+\1\b/ encuentra palabras repetidas: "el el gato"Anticipación y retrospección (lookaround)
| Símbolo | Significado |
|---|---|
| (?= ... ) | Anticipación positiva — seguido de |
| (?! ... ) | Anticipación negativa — no seguido de |
| (?<= ... ) | Retrospección positiva — precedido de |
| (?<! ... ) | Retrospección negativa — no precedido de |
/\d+(?= USD)/ coincide con 45 en "45 USD" pero no en "45 EUR"
/(?<=\$)\d+/ coincide con 99 en "$99", sin incluir el signo
/^(?=.*\d)(?=.*[a-z]).{8,}$/ al menos un dígito y una letra, 8 caracteres o másLa retrospección es la parte con menos soporte: JavaScript la admite desde ES2018 y PCRE desde hace mucho, pero el motor POSIX que usa Oracle no la tiene. Si tu patrón tiene que correr dentro de la base de datos, revisa antes qué sabor estás usando.
Banderas
| Bandera | Efecto |
|---|---|
| g | Global — encuentra todas las coincidencias, no solo la primera |
| i | No distingue mayúsculas de minúsculas |
| m | Multilínea — ^ y $ coinciden con los bordes de cada línea |
| s | Dot-all — el punto también coincide con saltos de línea |
| u | Modo Unicode — habilita \p{...} y el manejo por punto de código |
| y | Adherente — coincide solo desde lastIndex |
Ejemplos de patrones listos para usar
| Qué valida | Patrón |
|---|---|
| Correo (pragmático) | ^[^\s@]+@[^\s@]+\.[^\s@]{2,}$ |
| Dirección IPv4 | ^((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$ |
| Fecha ISO 8601 | ^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$ |
| Fecha y hora ISO 8601 | ^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})?$ |
| Hora en formato 24 h | ^([01]\d|2[0-3]):[0-5]\d(:[0-5]\d)?$ |
| URL http o https | ^https?://[^\s/$.?#][^\s]*$ |
| Color hexadecimal | ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ |
| Slug de URL | ^[a-z0-9]+(?:-[a-z0-9]+)*$ |
| UUID, versiones 1 a 5 | ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ |
| Número entero | ^-?\d+$ |
| Número decimal | ^-?\d+(\.\d+)?$ |
| Palabra duplicada | \b(\w+)\s+\1\b |
| Etiqueta HTML | </?[a-zA-Z][^>]*> |
| Espacios al final de línea (con m) | [ \t]+$ |
Una aclaración sobre el patrón de correo: es deliberadamente permisivo, y esa es la decisión honesta. El RFC 5322 admite partes locales entre comillas, comentarios y construcciones anidadas que ninguna expresión legible captura, mientras que las direcciones que la gente escribe mal de verdad no las rechaza ninguna expresión. El estándar HTML de WHATWG esquiva el problema definiendo su propio patrón, a propósito más estrecho, para input type="email", que además acepta a@b sin punto en el dominio. Usa la expresión para atrapar erratas y luego confirma la dirección enviándole un correo. Esa es la única validación real.
Diferencias entre lenguajes
La sintaxis básica es casi universal, pero los detalles cambian de motor a motor, y es donde se pierde más tiempo. Esto es lo que conviene saber antes de copiar un patrón de un lenguaje a otro.
| Motor | Qué cambia |
|---|---|
| JavaScript | Lookbehind desde ES2018. \d es solo ASCII. Usa la bandera u para \p{...}. |
| Python (re) | Grupos con nombre en la forma (?P<nombre>...). Por defecto \d y \w incluyen caracteres Unicode en str; usa re.ASCII para limitarlos. |
| Java | El patrón va dentro de un String, así que cada barra invertida se duplica: "\\d+". Sin banderas en el literal; se pasan a Pattern.compile. |
| PCRE (PHP, grep -P) | El sabor más completo: lookbehind, recursión y verbos de retroceso. El patrón lleva delimitadores, como /\d+/i. |
| Oracle (REGEXP_LIKE) | Estándar POSIX: sin lookaround y sin \d. Usa clases como [[:digit:]] y [[:alpha:]]. |
| grep básico (sin -E) | Necesita escapar +, ? y los paréntesis: \( \) \+. Con grep -E o egrep se comportan como esperas. |
Prueba estos patrones
Una tabla no te puede decir por qué un patrón falla con tu entrada concreta. El Probador de Expresiones Regulares de este sitio resalta las coincidencias en vivo mientras escribes, lista cada grupo de captura con su contenido y te deja activar y desactivar banderas para ver el efecto al instante, que es la forma más rápida de entender la diferencia entre coincidencia voraz y perezosa. Funciona por completo en tu navegador, así que ni los patrones ni el texto de prueba salen de tu dispositivo.