Guía rápida de expresiones regulares para principiantes

Una expresión regular (regex) es un patrón de búsqueda: \d{4} encuentra cuatro dígitos seguidos, ^ y $ fijan la coincidencia al inicio y al final, y los paréntesis capturan las partes que quieres reutilizar. Esta guía reúne la sintaxis que más vas a usar, con patrones para correo, teléfono y fechas probados con datos reales. Prueba cada ejemplo en el probador de regex de esta página mientras lees.

7 min de lectura

Lo básico en un minuto

La mayoría de los caracteres coinciden consigo mismos: gato encuentra las letras g, a, t, o en ese orden, en cualquier parte del texto, también dentro de gatos. Unos pocos caracteres tienen significado especial: . ^ $ * + ? ( ) [ ] { } | y la barra invertida. Para buscar uno de ellos literalmente, ponle una barra invertida delante: \. encuentra un punto real y \$ un signo de dólar.

Los ejemplos usan la sintaxis de JavaScript, la que ejecutan los navegadores, Node.js y el probador de esta página. Python, PHP (PCRE), Java y .NET comparten casi todo; las diferencias están sobre todo en lookbehind, la forma de nombrar grupos y algunos escapes. Escribe el patrón en Expresión regular sin las barras, pega el texto en Texto de prueba y cada coincidencia se resalta.

Pruébalo aquí: Probador de regex

Abrir la herramienta completa

Caracteres y clases

Una clase de caracteres coincide con un solo carácter de un conjunto. [aeiou] encuentra una vocal, [a-z] una letra minúscula ASCII, [^0-9] cualquier cosa que no sea un dígito. Dentro de los corchetes casi todos los caracteres especiales pierden su significado, así que [.?] encuentra un punto o un signo de interrogación. Si quieres un guion literal, ponlo al principio o al final: [-.] o [.-].

PatrónCoincide conEjemplo
.Cualquier carácter menos el salto de líneac.sa encuentra casa, cosa, c4sa
\dUn dígito del 0 al 9\d\d encuentra 42 en Sala 42
\wLetra, dígito o guion bajo (solo ASCII)\w+ encuentra usuario_01
\sEspacio, tabulación o salto de líneaa\sb encuentra a b
\D \W \SLo contrario de \d, \w y \s\D encuentra la x de 4x4
[abc]Una de a, b o cgr[ae]y encuentra gray y grey
[^abc]Cualquier carácter salvo a, b o c[^,]+ encuentra el texto entre comas
\p{L}Cualquier letra de cualquier idioma (flag u)\p{L}+ encuentra niño y canción completas
\bLímite de palabra (no es un carácter)\bsol\b encuentra sol pero no solo

Cuantificadores, anclas y grupos

Los cuantificadores indican cuántas veces se repite lo que tienen delante. Las anclas coinciden con una posición, no con un carácter. Los grupos juntan partes del patrón, capturan lo que coincidió y permiten elegir entre alternativas.

PatrónSignificadoEjemplo
*0 o más vecesab*c encuentra ac, abc, abbc
+1 o más veces\d+ encuentra 7 y 2026
?0 o 1 vez (opcional)colou?r encuentra color y colour
{3}Exactamente 3 veces\d{3} encuentra 555
{2,4}Entre 2 y 4 veces\d{2,4} encuentra 12, 123, 1234
{2,}2 o más vecesa{2,} encuentra aa y aaaa
*? +? ??Perezoso: lo menos posible<.+?> encuentra <b> y </b> por separado
^Inicio del texto (o de la línea con flag m)^Error solo encuentra Error al principio
$Final del texto (o de la línea con flag m)\.pdf$ encuentra nombres que terminan en .pdf
(abc)Grupo de captura, se reutiliza como $1(\d{4})-(\d{2}) captura año y mes
(?:abc)Grupo sin captura(?:ab)+ encuentra ababab
(?<anio>\d{4})Grupo con nombre, se reutiliza como $<anio>Aparece como anio en la tabla de grupos
a|ba o bgato|perro encuentra cualquiera de las dos
(?=x) (?!x)Seguido de x, no seguido de x\d+(?=px) encuentra 16 en 16px
(?<=x) (?<!x)Precedido de x, no precedido de x(?<=\$)\d+ encuentra 25 en $25

Flags

Los flags cambian el comportamiento de todo el patrón. En el probador son casillas junto al patrón; en código JavaScript van después de la barra de cierre, como en /gato/gi.

  • g (global): encuentra todas las coincidencias en vez de parar en la primera. Necesario para reemplazar todo.
  • i (ignorar mayúsculas): Gato, GATO y gato coinciden con gato.
  • m (multilínea): ^ y $ coinciden al inicio y al final de cada línea, no solo del texto completo. Úsalo con registros y listas.
  • s (dotAll): el punto también incluye saltos de línea, así .* puede abarcar varias líneas.
  • u (Unicode): activa \p{L} y otros escapes de propiedad, trata los emoji como un solo carácter y rechaza escapes desconocidos.
  • y (fijo o sticky): la coincidencia debe empezar justo donde terminó la anterior. Se usa sobre todo al escribir analizadores.

Patrones probados para correo, teléfono y fechas

Estos patrones se probaron con ejemplos válidos e inválidos. Añade ^ al principio y $ al final cuando valides un campo completo, y quítalos cuando busques dentro de un texto más largo.

Correo: [\w.+-]+@[\w-]+(\.[\w-]+)+ acepta ana.lopez+noticias@correo.ejemplo.com.mx y a@b.co, y rechaza yo@localhost porque exige un punto en el dominio. Es el patrón Correo de Patrones habituales en el probador. Como \w no incluye ñ ni vocales con tilde, también rechaza una dirección como peña@ejemplo.com; en la práctica casi todas las direcciones son ASCII. Ninguna regex confirma que una dirección exista: para eso envía un correo de confirmación.

Teléfono en formato internacional E.164: \+[1-9]\d{6,14} acepta +5215512345678 y +34612345678, el formato que piden los servicios de SMS y llamadas (un más, el código de país y como máximo 15 dígitos en total). Para números españoles de 9 cifras escritos a mano, (\+34\s?)?[6-9]\d{2}\s?\d{3}\s?\d{3} acepta 612 345 678, +34 612345678 y 912 345 678. Antes de guardar un número, normalízalo quitando todo lo que no sea dígito. Para encontrar en un texto números internacionales variados, como +44 20 7946 0958 o +1 (555) 123-4567, usa el patrón Teléfono de Patrones habituales en el probador.

Fecha ISO AAAA-MM-DD: \d{4}-\d{2}-\d{2} encuentra todo lo que tiene forma de fecha. La versión estricta (19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) rechaza el mes 13 y el día 00, pero sigue aceptando 2026-02-31. La regex comprueba la forma; si el día existe lo comprueban las funciones de fecha de tu lenguaje.

Para pasar fechas al formato día/mes/año, busca (\d{4})-(\d{2})-(\d{2}), marca Reemplazar con, escribe $3/$2/$1 en el campo de al lado y 2026-10-26 se convierte en 26/10/2026.

Errores comunes y cómo corregirlos

  • No escapar el punto: ejemplo.com también encuentra ejemploXcom. Escribe ejemplo\.com.
  • Coincidencia codiciosa: <.+> sobre <b>negrita</b> se lleva todo el texto. Usa la versión perezosa <.+?> o una clase negada <[^>]+>.
  • Olvidar las anclas al validar: \d{5} acepta abc12345xyz porque encuentra cinco dígitos dentro. Usa ^\d{5}$.
  • Esperar que \w incluya ñ, á o ü: sin el flag u solo cubre A-Z, a-z, 0-9 y _. Para nombres en español usa \p{L} con el flag u.
  • Olvidar el flag g: el reemplazo cambia solo la primera coincidencia y el probador muestra una sola.
  • Cuantificadores anidados como (a+)+ o (\w+\s?)+$: con ciertos textos tardan un tiempo exponencial, lo que se llama backtracking catastrófico. El probador detiene el patrón a los 1,5 segundos y te avisa; reescríbelo para que cada parte solo pueda coincidir de una manera.
  • Analizar HTML o JSON con regex: sirve para una búsqueda rápida, no para un análisis fiable. Para estructuras anidadas usa un analizador.

Cómo construir un patrón paso a paso

Empieza con un trozo literal del texto que buscas, por ejemplo 2026-10-26, y comprueba que coincide. Luego cambia partes por clases una a una: \d{4}-10-26 y después \d{4}-\d{2}-\d{2}. Tras cada cambio mira qué más se resalta en el texto de prueba, y añade algunas líneas que no deberían coincidir. Un buen texto de prueba incluye los casos que quieres y los que casi coinciden.

La tabla de Coincidencias muestra la posición y todos los grupos capturados de cada coincidencia. Si un grupo muestra la parte equivocada, mueve los paréntesis. Cuando el patrón funcione, cópialo a tu código tal cual: JavaScript y el probador usan el mismo motor, así que el resultado será idéntico.

Paso a paso

  1. Escribe el patrónEscribe la expresión en Expresión regular sin barras o elige una de Patrones habituales.
  2. Elige los flagsMarca g para todas las coincidencias, i para ignorar mayúsculas, m para anclas por línea y u para letras con tilde y ñ.
  3. Pega el texto de pruebaAñade ejemplos que deberían y que no deberían coincidir. Las coincidencias se resaltan mientras escribes.
  4. Revisa los gruposConsulta la tabla de Coincidencias para ver posiciones y grupos capturados.
  5. Previsualiza un reemplazoMarca Reemplazar con, escribe $1, $<nombre> o $& y mira el resultado antes de usarlo en tu código.

Preguntas frecuentes

¿Qué significa .* en una regex?

Cualquier carácter, cero o más veces, todas las posibles. Es codicioso y llega hasta el final de la línea; usa .*? para que se detenga en el primer punto posible.

¿Qué diferencia hay entre + y *?

+ exige al menos una repetición y * también acepta cero. \d+ necesita un dígito; \d* coincide incluso con un texto vacío.

¿Cómo busco un punto, un corchete o un signo de interrogación literal?

Ponle una barra invertida delante: \. \[ \? . Dentro de corchetes el punto y la interrogación ya son literales, así que [.?] también funciona.

¿Por qué mi regex no encuentra palabras con ñ o tilde?

\w y [a-z] solo cubren letras inglesas. Activa el flag u y usa \p{L}, o añade tú las letras a la clase, como [a-záéíóúüñ].

¿Se sube a algún sitio el texto que pruebo?

No. El probador se ejecuta en un proceso en segundo plano de tu navegador, así que tus registros y datos no salen de tu dispositivo. Una vez cargada la página, funciona también sin conexión.

¿Puede una regex validar del todo un correo electrónico?

No. Puede descartar errores evidentes, pero solo enviar un correo demuestra que la dirección existe. Mantén el patrón simple y confirma por correo.