El operador REGEXP para expresiones regulares

El operador REGEXP (o su sinónimo RLIKE) se usa en MySQL para buscar y procesar datos de texto mediante expresiones regulares.

El operador ~ para expresiones regulares

Los operadores ~ y ~* se usan en PostgreSQL para buscar y procesar datos de texto mediante expresiones regulares.

Las expresiones regulares ofrecen grandes posibilidades para patrones de búsqueda complejos, que serían difíciles de conseguir con el operador LIKE.

¿Cuándo usar expresiones regulares en lugar de LIKE?

El operador LIKE es cómodo para patrones de búsqueda sencillos, como encontrar cadenas que empiezan o terminan por un conjunto de caracteres concreto, o que contienen determinadas subcadenas. Sin embargo, si necesitas una búsqueda más compleja y flexible (por ejemplo, con varias condiciones o con caracteres especiales y rangos), los operadores de expresiones regulares se convierten en una herramienta imprescindible.

Es importante recordar que LIKE compara la cadena con el patrón completo, mientras que una expresión regular busca una coincidencia dentro de la cadena. Si necesitas comprobar precisamente el principio o el final de la cadena, usa los caracteres especiales ^ y $.

Sintaxis de las expresiones regulares

MySQL 8.4
WHERE campo_tabla REGEXP patron;
campo_tabla

La columna de texto en cuyos valores se busca una coincidencia.

patron

Una expresión regular entre comillas que define el patrón de búsqueda, por ejemplo '^John'.

MySQL 8.4
WHERE campo_tabla {~ | ~*} patron;
  • { a | b }una de las opciones
campo_tabla

La columna de texto en cuyos valores se busca una coincidencia.

~ | ~*

El operador de comparación con una expresión regular: ~ distingue entre mayúsculas y minúsculas; ~*, no.

patron

Una expresión regular entre comillas que define el patrón de búsqueda, por ejemplo '^John'.

Matices importantes

  1. Mayúsculas y minúsculas

    Por defecto, las expresiones regulares en MySQL no distinguen entre mayúsculas y minúsculas. Por ejemplo, la expresión REGEXP 'abc' encontrará tanto abc como Abc y ABC.

  2. Caracteres especiales

    Algunos caracteres tienen un significado especial en las expresiones regulares y hay que escaparlos (por ejemplo, ., *, +, ?, [, ], (, ), {, }, |, \).

    Para escapar estos caracteres, usa una barra invertida doble: \\.

  1. Mayúsculas y minúsculas

    Por defecto, las expresiones regulares en PostgreSQL distinguen entre mayúsculas y minúsculas.

    • Operador ~: distingue entre mayúsculas y minúsculas
    • Operador ~*: no distingue entre mayúsculas y minúsculas
  2. Caracteres especiales

    Algunos caracteres tienen un significado especial en las expresiones regulares y hay que escaparlos (por ejemplo, ., *, +, ?, [, ], (, ), {, }, |, \).

    Para escapar estos caracteres, usa una barra invertida simple: \.

Caracteres especiales y estructuras

Caracteres y estructurasA qué corresponden
*0 o más apariciones del patrón anterior
+1 o más apariciones del patrón anterior
.Cualquier carácter individual
?0 o 1 aparición del patrón anterior
^El principio de la cadena
$El final de la cadena
[abc]Cualquier carácter de los indicados entre corchetes
[^abc]Cualquier carácter que no esté entre los indicados en corchetes
[A-Z]Cualquier letra mayúscula
[a-z]Cualquier letra minúscula
[0-9]Cualquier dígito
p1|p2|p3Cualquiera de los patrones p1, p2 o p3
{n}n apariciones del patrón anterior
{m,n}Entre m y n apariciones del patrón anterior

Ejemplos explicados

  • Obtengamos a todos los usuarios cuyo nombre empieza por «John»:

    MySQL 8.4
    SELECT * FROM Users WHERE name REGEXP '^John'
    
    MySQL 8.4
    SELECT * FROM Users WHERE name ~ '^John'
    
    idnameemailemail_verified_atpasswordphone_number
    18John Travoltawainwrig@msn.com2016-11-19T12:30:43.000Zfzjhl0v82o0amalr8649+1 202 555 0176
    28Johnny Deppcgarcia@yahoo.ca2017-05-26T01:19:06.000Zqpp6hbnae42cdhmxlk4j+7 401 195 7363

    Esta expresión busca las cadenas que empiezan por «John». El carácter ^ indica el principio de la cadena.

  • Mostremos todas las asignaturas cuyo nombre termina en la letra «e» o «y»:

    MySQL 8.4
    SELECT * FROM  Subject WHERE name REGEXP '[ey]$'
    
    MySQL 8.4
    SELECT * FROM  Subject WHERE name ~ '[ey]$'
    
    idname
    2Russian language
    3Literature
    5Chemistry
    6Geography
    7History
    8Biology
    9English language
    11Physical Culture
    13Technology

    En este ejemplo, [ey] define la lista de valores posibles y $ indica en qué debe terminar la cadena.

  • Busquemos a todos los usuarios cuyo correo electrónico termina en «@outlook.com» o en «@icloud.com»:

    MySQL 8.4
    SELECT * FROM Users WHERE email REGEXP '@(outlook\\.com|icloud\\.com)$'
    
    MySQL 8.4
    SELECT * FROM Users WHERE email ~ '@(outlook\.com|icloud\.com)$'
    
    idnameemailemail_verified_atpasswordphone_number
    7Samuel L. Jacksonmoonlapse@outlook.com2018-07-19T11:16:13.000Zi6yvht95527z3idgqx9y+1 202 555 0162
    13Steve Martinnelson@outlook.com2016-07-29T04:25:00.000Zw76yphg3kvzg77ilmxfs+1 202 555 0138
    29Pierce Brosnantreeves@icloud.com2019-03-08T01:56:00.000Zlqiwecclne9rv8woo2go+7 401 749 3620
    30Sean Conneryjschauma@icloud.com2016-05-21T00:45:17.000Zlyh4jkdxkvtvulvqi5db+7 401 511 6783
    31Bruce Williskewley@icloud.com2016-12-08T20:18:59.000Z0ofa2khvnptiackbssv0+375 154 771 3462

    Aquí también se usa $ para marcar el final de la cadena y | para indicar varias opciones.

  • Busquemos a todos los usuarios cuyo número de teléfono no contiene los dígitos «2» ni «8»:

    MySQL 8.4
    SELECT * FROM Users WHERE phone_number REGEXP '^[^28]*$'
    
    MySQL 8.4
    SELECT * FROM Users WHERE phone_number ~ '^[^28]*$'
    
    idnameemailemail_verified_atpasswordphone_number
    27Brad Pittkewley@optonline.net2017-02-11T05:45:15.000Z829j2ygocn8btzae49kv+7 401 741 3797
    28Johnny Deppcgarcia@yahoo.ca2017-05-26T01:19:06.000Zqpp6hbnae42cdhmxlk4j+7 401 195 7363

    En este ejemplo, [^28] representa cualquier carácter excepto «2» y «8», y * significa cualquier cantidad de esos caracteres. Los caracteres ^ y $ marcan el principio y el final de la cadena, respectivamente, y garantizan que toda la cadena se ajuste al patrón.

  • Busquemos a todos los usuarios cuyo número de teléfono empieza por «+7»

    MySQL 8.4
    SELECT name, phone_number FROM Users WHERE phone_number REGEXP '^\\+7'
    
    MySQL 8.4
    SELECT name, phone_number FROM Users WHERE phone_number ~ '^\+7'
    
    namephone_number
    Hideo Kojima+7 401 452 0052
    ClINT Eastwood+7 401 722 0912
    Brad Pitt+7 401 741 3797
    Johnny Depp+7 401 195 7363
    Pierce Brosnan+7 401 749 3620
    Sean Connery+7 401 511 6783

    En este ejemplo, ^ significa el principio de la cadena. Es decir, buscamos cadenas que empiezan por un patrón concreto.

    Como + es un carácter especial en las expresiones regulares, hay que escaparlo con una barra invertida doble (\\) para que se interprete como un + normal. Así, \\+ corresponde al signo + de la cadena.

    Como + es un carácter especial en las expresiones regulares, hay que escaparlo con una barra invertida simple (\) para que se interprete como un + normal. Así, \+ corresponde al signo + de la cadena.