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
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'.
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
-
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.
-
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: \\.
-
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
-
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
Ejemplos explicados
-
Obtengamos a todos los usuarios cuyo nombre empieza por «John»:
MySQL 8.4SELECT * FROM Users WHERE name REGEXP '^John'MySQL 8.4SELECT * FROM Users WHERE name ~ '^John'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.4SELECT * FROM Subject WHERE name REGEXP '[ey]$'MySQL 8.4SELECT * FROM Subject WHERE name ~ '[ey]$'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.4SELECT * FROM Users WHERE email REGEXP '@(outlook\\.com|icloud\\.com)$'MySQL 8.4SELECT * FROM Users WHERE email ~ '@(outlook\.com|icloud\.com)$'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.4SELECT * FROM Users WHERE phone_number REGEXP '^[^28]*$'MySQL 8.4SELECT * FROM Users WHERE phone_number ~ '^[^28]*$'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.4SELECT name, phone_number FROM Users WHERE phone_number REGEXP '^\\+7'MySQL 8.4SELECT name, phone_number FROM Users WHERE phone_number ~ '^\+7'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.