MySQL Expresiones regulares (Regexp)

⚡ Resumen inteligente

MySQL Las expresiones regulares (REGEXP) comparan los valores de las columnas con patrones flexibles que los comodines no pueden expresar. Esto explica la sintaxis de REGEXP, el sinónimo RLIKE, todos los metacaracteres admitidos, ejemplos de consultas corregidas contra la base de datos myflixdb y las funciones de expresiones regulares añadidas en MySQL 8.0.

  • 🔍 Nuestras Operacolina: REGEXP compara una columna con un patrón y devuelve 1 si coincide, mientras que RLIKE es un sinónimo exacto de REGEXP.
  • 🧩 Patrón de Costura Anchors: El acento circunflejo (^) ancla la coincidencia al inicio del valor, y el signo de dólar ($) la ancla al final.
  • 🔤 Listas de personajes: [abcd] coincide con cualquier carácter entre comillas, y [^abcd] excluye todos los caracteres entre comillas del conjunto de resultados.
  • ➕ Cuantificadores: El asterisco, el signo más y el signo de interrogación se aplican al carácter individual que los precede, no a toda la cadena.
  • 🛡️ Escaping Regla: Una barra invertida literal debe duplicarse dentro de un patrón, porque MySQL procesa la cadena dos veces.
  • 🆕 Cambio de versión: MySQL 8.0 se trasladó al motor ICU, reemplazó [[:<:]] y [[:>:]] con \b, y agregó REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR y REGEXP_INSTR.
  • ⚡ Nota de rendimiento: Las expresiones regulares nunca utilizan un índice, por lo que siempre que la consulta lo permita, filtre primero las filas con una condición indexada.

¿Qué son MySQL ¿expresiones regulares?

MySQL expresiones regulares Te ayuda a buscar datos que coincidan con criterios complejos. Una expresión regular es un patrón que describe la forma del valor que buscas, en lugar del valor en sí.

Si ya has trabajado con MySQL comodinesQuizás te preguntes por qué vale la pena aprender expresiones regulares cuando LIKE produce resultados similares. La respuesta es su poder expresivo: los comodines solo ofrecen dos símbolos, mientras que las expresiones regulares describen rangos de caracteres, alternativas, repeticiones y posiciones de palabras en un solo patrón.

Una vez establecido el objetivo, la siguiente sección presenta la sintaxis que utilizará en cada consulta REGEXP.

Sintaxis básica de REGEXP

La sintaxis básica para una expresión regular es la siguiente.

SELECT * FROM table_name
WHERE fieldname REGEXP 'pattern';

AQUÍ:

  • “Sentencia SELECT” es el estándar Instrucción SELECT.
  • “DONDE nombre de campo” es el nombre de la columna sobre la que se realiza la expresión regular.
  • “Patrón 'REGEXP'” — REGEXP es el operador de expresiones regulares, y 'patrón' representa el patrón que se va a comparar. RLIKE es un sinónimo de REGEXP y devuelve los mismos resultados. Para evitar confundirlo con el operador LIKE, es mejor usar REGEXP.

Veamos ahora un ejemplo práctico.

SELECT * FROM `movies`
WHERE `title` REGEXP 'code';

La consulta anterior busca todos los títulos de películas que contengan la palabra "código". No importa si "código" aparece al principio, en medio o al final del título. Siempre que el título contenga el patrón, se devuelve la fila.

Comparar el inicio de un valor con una lista de caracteres.

Supongamos que queremos las películas cuyos títulos comiencen con a, b, c o d, seguidas de cualquier número de otros caracteres. Combinamos una lista de caracteres con el metacaracter circunflejo para lograr ese resultado.

SELECT * FROM `movies`
WHERE `title` REGEXP '^[abcd]';

Ejecutando el script anterior en MySQL Banco de trabajo La búsqueda en la base de datos myflixdb nos da los siguientes resultados.

id_película título director año_de lanzamiento categoria ID
4 Code Nombre Negro Edgar Jimz 2010 NULL
5 Las niñas de papá NULL 2007 8
6 Ángeles y demonios NULL 2007 6
7 Da Vinci Code NULL 2007 6

En el patrón '^[abcd]', el circunflejo (^) requiere que la coincidencia comience al principio del valor, y la lista de caracteres [abcd] acepta solo títulos cuya primera letra sea a, b, c o d. La comparación no distingue entre mayúsculas y minúsculas bajo la intercalación predeterminada, por lo que “Code Se devuelve el nombre "Black".

Excluyendo personajes con una lista de caracteres negada

Ahora vamos a modificar el script y negar la lista de caracteres para ver qué filas se devuelven.

SELECT * FROM `movies`
WHERE `title` REGEXP '^[^abcd]';

Ejecutando el script anterior en MySQL Workbench, al realizar una consulta a la base de datos myflixdb, nos proporciona los siguientes resultados.

id_película título director año_de lanzamiento categoria ID
1 Piratas del Caribe 4 Rob Marshall 2011 1
2 Olvidando a Sarah Marshal Nicolás Stoller 2008 2
3 X-Men 2008
9 Honey moonERS Juan Schultz 2005 8
16 67% culpable 2012
17 El gran dictador Chalie Chaplie 1920 7
18 película de muestra Anónimo 8
19 película 3 John Brown 1920 8

Dentro de una lista de caracteres, el significado del circunflejo cambia: '^[^abcd]' sigue anclando la coincidencia al principio, mientras que [^abcd] ahora excluye todos los títulos que comienzan con uno de los caracteres encerrados.

Estos dos ejemplos utilizan únicamente anclas y listas de caracteres. La siguiente sección abarca el conjunto completo de metacaracteres.

Metacaracteres de expresión regular

Los ejemplos anteriores muestran la forma más simple de una expresión regular. Los metacaracteres permiten ajustar con precisión una búsqueda de patrones: expresan repetición, alternativas, rangos y posiciones. La tabla siguiente enumera todos los metacaracteres compatibles con el MySQL Operador REGEXP, con un ejemplo corregido para cada uno.

Char Mareas Ideales para Lecciones Ejemplo
* El asterisco (*) coincide con cero (0) o más instancias de la solo personaje que lo precede. SELECCIONE * DE películas DONDE título REGEXP 'da*'; coincide con una “d” seguida de cero o más caracteres “a”, por lo que Da Vinci Code y Daddy's Little Girls cumplen los requisitos. Use 'da+' cuando la letra “a” deba estar presente.
+ El más (+) coincide con una o más instancias del carácter que lo precede. SELECCIONE * DE `películas` DONDE `título` REGEXP `mon+’; Muestra todas las películas que contienen “mon” seguido de uno o más caracteres “n”. Por ejemplo, Ángeles y demonios.
? El signo de interrogación (?) coincide con cero (0) o una instancia del carácter que lo precede. SELECCIONE * DE `categorías` DONDE `nombre_categoría` REGEXP `com?’; Combina “co” con una “m” opcional. Por ejemplo, comedia y comedia romántica.
. El punto (.) coincide con cualquier carácter individual excepto un salto de línea. SELECCIONE * DE películas DONDE `año_de lanzamiento` REGEXP `200.’; Muestra todas las películas estrenadas en un año que comienza con “200” seguido de cualquier carácter. Por ejemplo: 2005, 2007, 2008.
[a B C] El lista de caracteres [abc] coincide con cualquiera de los caracteres incluidos. SELECCIONE * DE `películas` DONDE `título` REGEXP ‘[vwxyz]’; Muestra todas las películas que contienen cualquier personaje de “vwxyz”. Por ejemplo, X-Men y Da Vinci Code.
[^ abc] El lista negada [^abc] coincide con cualquier carácter excepto los que están encerrados. SELECCIONE * DE `películas` DONDE `título` REGEXP ‘^[^vwxyz]’; Muestra todas las películas cuyo título no comienza con un carácter en “vwxyz”.
[ARIZONA] El rango [AZ] coincide con cualquier letra mayúscula. SELECCIONE * DE `miembros` DONDE `dirección_postal` REGEXP ‘[A-Z]’; Se otorga a todos los miembros cuya dirección postal contiene una letra entre la A y la Z. Por ejemplo, Janet Jones con el número de miembro 1.
[Arizona] El rango [az] coincide con cualquier letra minúscula. SELECCIONE * DE `miembros` DONDE `dirección_postal` REGEXP ‘[a-z]’; Muestra todos los miembros cuya dirección postal contiene una letra entre la a y la z. Tenga en cuenta que la intercalación predeterminada no distingue entre mayúsculas y minúsculas, por lo que este rango también coincide con las letras mayúsculas.
[0 9-] El rango [0-9] coincide con cualquier dígito del 0 al 9. SELECT * FROM `members` WHERE `contact_number` REGEXP '[0-9]'; da todos los miembros cuyo número de contacto contiene al menos un dígito. Por ejemplo, Robert Phil.
^ El cursor (^) ancla la coincidencia al inicio del valor. SELECCIONE * DE `películas` DONDE `título` REGEXP `^[cd]’; Muestra todas las películas cuyo título comienza con “c” o “d”. Por ejemplo, Code Nombre Black, Las niñas de papá y Da Vinci Code.
$ El signo de dólar ($) ancla la coincidencia al final del valor. SELECCIONAR * DE `películas` DONDE `título` EXPRESIÓN REGULAR 'código$'; Muestra todas las películas cuyo título termina en “código”. Por ejemplo, Davinci Code.
| El barra vertical (|) aísla las alternativas. SELECCIONE * DE `películas` DONDE `título` REGEXP ‘^[cd]|^[u]’; Muestra todas las películas cuyo título comienza con “c”, “d” o “u”. Por ejemplo, Code Nombre Black, Da Vinci Codey el Inframundo – Awakening.
\b El límite de palabra (\b) coincide con el inicio o el final de una palabra. Reemplaza los marcadores antiguos [[:<:]] y [[:>:]], que MySQL 8.0 eliminado. SELECT * FROM `movies` WHERE `title` REGEXP '\\bfor'; Muestra todas las películas con una palabra que comienza con "for". Por ejemplo, Forgetting Sarah Marshall. En MySQL 5.7 El patrón equivalente es '[[:<:]]for'.
[[:clase:]] El clase de personaje coincide con un grupo de caracteres con nombre: [[:alpha:]] para letras, [[:space:]] para espacios en blanco, [[:punct:]] para puntuación y [[:upper:]] para letras mayúsculas. Tenga en cuenta el doble corchetes. SELECT * FROM `movies` WHERE `title` REGEXP '^[[:alpha:][:space:]]+$'; Muestra todas las películas cuyo título contiene solo letras y espacios. Por ejemplo, "Forgetting Sarah Marshall", mientras que "Piratas del Caribe 4" se omite debido al dígito.

La barra invertida (\) es el carácter de escape. Porque MySQL primero analiza la cadena y luego el patrón, una barra invertida literal debe escribirse como una doble barra invertida (\\) dentro de un patrón REGEXP.

⚠️ Advertencia de versión: MySQL 8.0.4 reemplazó el antiguo motor de expresiones regulares con la biblioteca ICU. Los marcadores de palabras [[:<:]] y [[:>:]] se eliminaron en esa versión, por lo que los patrones copiados de material antiguo fallan con un "error de sintaxis" en MySQL 8.0. Utilice \b en su lugar.

Ahora que se han definido todos los metacaracteres, surge una pregunta pertinente: ¿cuándo debería REGEXP reemplazar al operador LIKE, que es más sencillo?

REGEXP vs LIKE: ¿cuál deberías usar?

Ambos operadores filtran filas por patrón, pero resuelven problemas diferentes. LIKE solo entiende dos símbolos, mientras que REGEXP entiende el conjunto completo de metacaracteres que se muestra arriba. Esta capacidad tiene un costo, por lo que la elección implica una compensación más que una preferencia.

Criterio COMO REGEXP
Símbolos de patrones % y _ solamente Anchors, rangos, alternancia, cuantificadores, clases de caracteres
Uso típico Búsquedas por prefijo, sufijo y "contiene" Validación, múltiples alternativas, coincidencia sensible a la posición
Uso del índice Posible cuando el patrón no comienza con % Nunca utiliza un índice
Valor de retorno VERDADERO o FALSO 1 o 0, y NULL cuando cualquiera de los operandos es NULL.

Para coincidencias sencillas, elija LIKE, ya que se lee bien y permite usar índices. Elija REGEXP cuando un solo patrón deba expresar varias reglas a la vez, como «comienza con c o d y termina con un dígito». En tablas grandes, primero filtre las filas con una condición indexada y luego aplique REGEXP a ese conjunto reducido.

MySQL 8.0 funciones de expresiones regulares

El operador REGEXP responde a una sola pregunta: ¿coincide el valor con el patrón? MySQL 8.0 agregó cuatro funciones que van más allá y le permiten localizar, por ejemplotract, y reescribe el texto coincidente. Cada uno acepta un argumento opcional match_type, donde 'c' fuerza una comparación sensible a mayúsculas y minúsculas y 'i' fuerza una que no lo sea.

  • REGEXP_LIKE(expr, patrón) Devuelve 1 cuando el valor coincide con el patrón. Es la forma funcional del operador REGEXP, y el argumento match_type hace explícita la distinción entre mayúsculas y minúsculas.
  • REGEXP_INSTR(expr, patrón) Devuelve la posición del primer carácter coincidente, o 0 cuando no se encuentra el patrón.
  • REGEXP_SUBSTR(expr, patrón) Devuelve la subcadena coincidente, lo cual resulta útil para extraer un año, un código o un número de un texto más largo.
  • REGEXP_REPLACE(expr, patrón, reemplazo) devuelve el valor con cada coincidencia reemplazada, por lo que puede limpiar los datos dentro de un Consulta SQL de actualización.
SELECT title,
       REGEXP_SUBSTR(title, '[0-9]+') AS number_in_title
FROM `movies`
WHERE REGEXP_LIKE(title, '[0-9]');

La consulta anterior devuelve todos los títulos de películas que contienen un dígito, junto con los dígitos mismos. MySQL 5.7 Estas funciones no están disponibles, por lo que el operador REGEXP sigue siendo la única opción.

Preguntas Frecuentes

No por defecto. REGEXP sigue la intercalación de la columna, y las intercalaciones estándar no distinguen entre mayúsculas y minúsculas. Añada la palabra clave BINARY antes de la columna o llame a REGEXP_LIKE con el tipo de coincidencia 'c' para forzar una comparación que distinga entre mayúsculas y minúsculas.

No hay diferencia funcional. RLIKE es un sinónimo de REGEXP que MySQL Se mantiene por compatibilidad. En la práctica, se prefiere REGEXP, porque RLIKE se confunde fácilmente con la no relacionada Operador LIKE Se utiliza para comodines.

REGEXP no puede usar un índice, por lo que MySQL Evalúa el patrón fila por fila. Primero, reduce las filas escaneadas con una condición indexada, un rango de fechas o un índice de texto completo, y aplica la expresión regular a ese conjunto de resultados más pequeño.

Sí. Los asistentes de IA convierten una regla en lenguaje natural en un patrón REGEXP y explican cada metacaracter. Prueba el resultado en MySQL Banco de trabajo contra filas de muestra, porque un solo ancla mal colocada cambia todo el conjunto de resultados.

Sí. Los asistentes de IA generan sentencias REGEXP_REPLACE que eliminan la puntuación, normalizan los números de teléfono o recortan los espacios sobrantes. Ejecute primero el patrón dentro de una sentencia SELECT, confirme los valores reescritos y solo entonces aplíquelo en una sentencia SELECT. Declaración UPDATE.

Resumir este post con: