EXPRESIONES REGULARES EN MYSQL: GUÍA COMPLETA
Las >Las expresiones regulares o regex son una herramienta muy potente para realizar búsquedas y manipulaciones de texto avanzadas en bases de datos. MySQL las soporta de forma nativa mediante el operador REGEXP y su sinónimo RLIKE. A partir de MySQL 8.0 se incorporaron funciones específicas más potentes.Introducción y Sintaxis Básica
El operador principal es:WHERE columna REGEXP 'patrón'
- "REGEXP" devuelve 1 (TRUE) si hay coincidencia.
- "NOT REGEXP" devuelve 1 si no hay coincidencia.
- "RLIKE" es idéntico a "REGEXP".
SELECT * FROM usuarios
WHERE nombre REGEXP '^J';
Metacaracteres más utilizados
| Metacarácter | Descripción | Ejemplo |
|---|---|---|
| "^" | Inicio de la cadena | "^abc" |
| "$" | Fin de la cadena | "abc$" |
| "." | Cualquier carácter (excepto nueva línea) | "a.c" |
| "*" | Cero o más ocurrencias | "ab*" |
| "+" | Una o más ocurrencias | "ab+" |
| "?" | Cero o una ocurrencia | "ab?" |
| "{n}" | Exactamente n veces | "a{3}" |
| "{n,m}" | Entre n y m veces | "a{2,5}" |
| "[]" | Clase de caracteres | "[aeiou]" o "[0-9]" |
| "[^]" | Clase negada | "[^0-9]" |
| "|" | Alternativa (OR) | "abc|def" |
| "()" | Agrupación | "(abc)+" |
| "\d" | Dígito (0-9) | "\d+" |
| "\D" | No dígito | "\D" |
| "\w" | Caracter alfanumérico + _ | "\w+" |
| "\s" | Espacio en blanco | "\s" |
| "\\" | Escape de carácter especial | "\." |
Ejemplos Prácticos
Validación de email (básico)
SELECT email
FROM contactos
WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$';
Teléfonos españoles
-- Teléfonos que empiecen por 6, 7 o 9 y tengan 9 dígitos
WHERE telefono REGEXP '^[679][0-9]{8}$';
Palabras que contienen "mysql" sin importar mayúsculas/minúsculas
WHERE descripcion REGEXP '[Mm][Yy][Ss][Qq][Ll]';
-- O más simple en MySQL 8.0+ con REGEXP_LIKE y flag
Extraer dominios de emails
SELECT
email,
REGEXP_SUBSTR(email, '@([A-Za-z0-9.-]+)', 1, 1, 'i', 1) AS dominio
FROM usuarios;
Funciones de Expresiones Regulares (MySQL 8.0+)
A partir de MySQL 8.0 se añadieron funciones muy útiles:- "REGEXP_LIKE(columna, patrón [, match_type])": equivalente a "REGEXP"
- "REGEXP_INSTR(columna, patrón [, posición [, ocurrencia [, return_option [, match_type]]]])": posición de la coincidencia
- "REGEXP_SUBSTR(columna, patrón [, posición [, ocurrencia [, match_type]]])": extrae la subcadena
- "REGEXP_REPLACE(columna, patrón, reemplazo [, posición [, ocurrencia [, match_type]]])": reemplaza
/
UPDATE productos
SET descripcion = REGEXP_REPLACE(descripcion, '[^A-Za-z0-9áéíóúñÁÉÍÓÚÑ ]', ' ')
WHERE id = 123;
- "'i'": case-insensitive
- "'c'": case-sensitive
- "'m'": multilínea
- "'n'": . coincide con saltos de línea
Rendimiento y Buenas Prácticas
- Las expresiones regulares son más lentas que LIKE o comparaciones simples.
- Evitar usar "REGEXP" en columnas que no tengan índice, o crear índices funcionales cuando sea posible.
- "LIKE 'J%'" es mucho más rápido que "REGEXP '^J'".
- Prueba siempre tus patrones con datos reales.
- Usa EXPLAIN para ver el costo de la consulta.