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.

¿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.
