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".
Ejemplo básico:

SELECT * FROM usuarios 
WHERE nombre REGEXP '^J';
Esto devuelve todos los usuarios cuyo nombre empiece por "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 "\."
Nota importante: MySQL utiliza la sintaxis de expresiones regulares POSIX extendida.

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
Ejemplo de limpieza de texto:

/
UPDATE productos 
SET descripcion = REGEXP_REPLACE(descripcion, '[^A-Za-z0-9áéíóúñÁÉÍÓÚÑ ]', ' ')
WHERE id = 123;
Parámetro "match_type":
  • "'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.