¿Qué es una expresión regular?
Una expresión regular (regex o regexp) es un patrón que describe un tipo de texto: «ocho cifras y una letra», «algo, una arroba, algo, un punto y algo». Sirve para buscar, comprobar si un dato tiene el formato correcto o reemplazar partes de un texto, y la entienden casi todos los lenguajes de programación, los editores de código y herramientas como Excel o Google Sheets.
Chuleta
| Escribe | Significa | Ejemplo |
|---|---|---|
. | Cualquier carácter salvo el salto de línea (con la bandera s, también ese) | c.sa → casa, cosa |
\d \w \s | Una cifra; una letra, cifra o _ (sin tildes ni ñ); un espacio, tabulador o salto de línea | \d\d → 42 |
\D \W \S | Lo contrario: lo que no es cifra, letra o espacio | \S+ → una palabra |
[abc] [a-z] | Uno de esos caracteres, o uno del rango | [aeiou] → una vocal |
[^abc] | Cualquier carácter menos esos | [^0-9] → lo que no es cifra |
^ $ | Principio y final del texto (con la bandera m, de cada línea) | ^\d+$ → solo cifras |
\b | Límite de palabra | \bsol\b → sol, pero no soldado |
* + ? | Lo anterior, 0 o más veces; 1 o más; 0 o 1 | colou?r → color, colour |
{3} {2,4} {2,} | Exactamente 3 veces; de 2 a 4; 2 o más | \d{5} → 28013 |
*? +? | Versión perezosa: lo menos posible | <.+?> → una etiqueta HTML, no todas |
(…) | Grupo de captura: se guarda y se usa como $1 en el reemplazo | (\d+)€ |
(?:…) | Grupo sin captura: solo agrupa | (?:ab)+ → ababab |
(?<nombre>…) | Grupo con nombre: $<nombre> en el reemplazo | (?<anio>\d{4}) |
a|b | Una cosa o la otra | gato|perro |
\1 | Lo mismo que capturó el grupo 1 | (\w)\1 → ll, rr |
(?=…) (?!…) | Seguido de…, no seguido de… (sin incluirlo) | \d+(?=€) → el número de 20€ |
(?<=…) (?<!…) | Precedido de…, no precedido de… | (?<=#)\w+ → el texto de un #hashtag |
\. \* \( | El carácter tal cual: los símbolos especiales se escapan con \ | \d+\.\d+ → 3.14 |
Las banderas
g(global): todas las coincidencias, no solo la primera.i(sin mayúsculas): no distingue mayúsculas de minúsculas.m(multilínea): ^ y $ marcan el principio y el final de cada línea.s(punto total): el punto también coincide con los saltos de línea.u(unicode): unicode completo: emojis y clases como \p{l}.
Expresiones regulares útiles
Las mismas que puedes cargar con un clic en los ejemplos de arriba. Comprueban el formato, no si el dato existe: para la letra del DNI usa el validador de NIF, NIE y CIF, y para los dígitos de control de una cuenta, el validador de IBAN.
| Para | Expresión | Qué hace |
|---|---|---|
[\w.+-]+@[\w-]+(?:\.[\w-]+)*\.[A-Za-z]{2,} | Direcciones de email dentro de un texto. | |
| Teléfono | (?:\+34[\s-]?|\b)[6-9](?:[\s-]?\d){8}\b | Teléfonos españoles de 9 cifras, con o sin +34 y con espacios o guiones. |
| DNI y NIE | \b(?:\d{8}|[XYZ]\d{7})[A-Z]\b | El formato del DNI y del NIE. No comprueba la letra. |
| Código postal | \b(?:0[1-9]|[1-4]\d|5[0-2])\d{3}\b | Códigos postales españoles: empiezan por el número de provincia, del 01 al 52. |
| IBAN | \bES\d{2}(?:\s?\d{4}){5}\b | IBAN español, con o sin espacios. No comprueba los dígitos de control. |
| Matrícula | \b\d{4}[\s-]?[BCDFGHJKLMNPRSTVWXYZ]{3}\b | Matrículas españolas desde el año 2000: cuatro cifras y tres consonantes, sin vocales, Ñ ni Q. |
| URL | https?://[^\s<>"']+[^\s<>"'.,;:!?)] | Enlaces dentro de un texto, sin el punto o la coma que los siga. |
| IP | \b(?:(?: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)\b | Direcciones IPv4, con cada número entre 0 y 255. |
| Fecha | \b(?<dia>0?[1-9]|[12]\d|3[01])/(?<mes>0?[1-9]|1[0-2])/(?<anio>\d{4})\b | Fechas dd/mm/aaaa con grupos con nombre; el reemplazo las pasa a aaaa-mm-dd. |
| Color hex | #(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{3})\b | Colores en hexadecimal, de 3 o 6 cifras. |
| Palabras repetidas | \b(\w+)\s+\1\b | Una palabra escrita dos veces seguidas, con una referencia al grupo 1; el reemplazo deja una. |
| Espacios de más | [ \t]{2,} | Dos o más espacios o tabuladores seguidos; el reemplazo deja uno. |
Tildes y eñes
\w solo incluye letras inglesas: no reconoce la á ni la ñ, así que \w+ parte «España» en dos. Para el español, escríbelas a mano ([\wáéíóúüñÁÉÍÓÚÜÑ]+) o activa la bandera u y usa \p{L}, que es cualquier letra de cualquier idioma.
JavaScript, PHP y otros lenguajes
Este probador usa el motor de JavaScript de tu navegador. PHP, Python, Java o .NET comparten casi toda la sintaxis, pero no toda. En PHP, la expresión va entre delimitadores ('/\d+/'), no existe la bandera g (se usa preg_match_all()) y, en el reemplazo, los grupos con nombre se escriben con su número. El código PHP de la pestaña «Código» ya tiene esos cambios hechos.
Cuidado con el backtracking catastrófico
Algunas expresiones, como (a+)+$ o (\w+\s?)+$, prueban todas las formas posibles de repartir el texto entre sus cuantificadores antes de rendirse, y con un texto que casi coincide el número de intentos se dispara: con 30 caracteres pueden ser más de mil millones. Una expresión así puede bloquear una página web o tumbar un servidor, y es un tipo de ataque conocido (ReDoS).
Este probador para la búsqueda a los 2 segundos y te avisa. Para evitarlo, no anides cuantificadores sobre lo mismo ((a+)+) y usa clases concretas en vez de .* cuando puedas. Pruébalo: busca (a+)+$ en aaaaaaaaaaaaaaaaaaaaaaaaaaaaaab.