¿Qué son las expresiones regulares?
Las expresiones regulares ayudan a buscar datos que coincidan con criterios complejos. Observamos los comodines en el tutorial anterior. Si ha trabajado con comodines antes, es posible que se pregunte por qué aprender expresiones regulares cuando puede obtener resultados similares utilizando los comodines. Porque, en comparación con los comodines, las expresiones regulares nos permiten buscar datos que coincidan con criterios aún más complejos.
Sintaxis básica
La sintaxis básica de una expresión regular es la siguiente
SELECT statements… WHERE fieldname REGEXP 'pattern';
AQUÍ -
- "Sentencias SELECT ..." es la sentencia SELECT estándar
- "WHERE fieldname" es el nombre de la columna en la que se realizará la expresión regular.
- "REGEXP 'patrón'" REGEXP es el operador de expresión regular y 'patrón' representa el patrón que debe coincidir con REGEXP. RLIKE es sinónimo de REGEXP y consigue los mismos resultados que REGEXP. Para evitar confundirlo con el operador LIKE, es mejor usar REGEXP en su lugar.
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 contienen el código de la palabra. No importa si el "código" está al principio, en el medio o al final del título. Siempre que esté contenido en el título, se considerará.
Supongamos que queremos buscar películas que comiencen con a, b, c o d, seguidas de cualquier número de otros personajes, ¿cómo haríamos para lograrlo? Podemos usar una expresión regular junto con los metacaracteres para lograr los resultados deseados.
SELECT * FROM `movies` WHERE `title` REGEXP '^[abcd]';
La ejecución del script anterior en MySQL workbench contra myflixdb nos da los siguientes resultados.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
4 | Code Name Black | Edgar Jimz | 2010 | NULL |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
6 | Angels and Demons | NULL | 2007 | 6 |
7 | Davinci Code | NULL | 2007 | 6 |
Echemos ahora un vistazo de cerca a nuestra expresión regular responsable del resultado anterior.
'[abcd]' el signo de intercalación (^) significa que la coincidencia de patrones debe aplicarse al principio y la lista de caracteres [abcd] significa que solo los títulos de películas que comienzan con a, b, c o d se devuelven en nuestro conjunto de resultados.
Modifiquemos nuestro script anterior y usemos la lista NOT charlist y veamos qué resultados obtendremos después de ejecutar nuestra consulta.
SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';
La ejecución del script anterior en MySQL workbench contra myflixdb nos da los siguientes resultados.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
1 | Pirates of the Caribean 4 | Rob Marshall | 2011 | 1 |
2 | Forgetting Sarah Marshal | Nicholas Stoller | 2008 | 2 |
3 | X-Men | 2008 | ||
9 | Honey mooners | John Schultz | 2005 | 8 |
16 | 67% Guilty | 2012 | ||
17 | The Great Dictator | Chalie Chaplie | 1920 | 7 |
18 | sample movie | Anonymous | 8 | |
19 | movie 3 | John Brown | 1920 | 8 |
Echemos ahora un vistazo de cerca a nuestra expresión regular responsable de los resultados anteriores.
'[abcd]' el signo de intercalación (^) significa que la coincidencia de patrón debe aplicarse al principio y la lista de caracteres [abcd] significa que los títulos de películas que comienzan con cualquiera de los caracteres incluidos se excluyen del conjunto de resultados.
Metacaracteres de expresión regular
Lo que vimos en el ejemplo anterior es la forma más simple de una expresión regular. Veamos ahora las coincidencias de patrones de expresión regular más avanzadas. Supongamos que queremos buscar títulos de películas que comiencen con el patrón "código" solo usando una expresión regular, ¿cómo lo haríamos? La respuesta son los metacaracteres. Nos permiten ajustar los resultados de la búsqueda de patrones utilizando expresiones regulares.
Carbonizarse | Descripción | Ejemplo | |
---|---|---|---|
* | El metacarácter de asterisco (*) se usa para hacer coincidir cero (0) o más instancias de las cadenas que lo preceden | SELECCIONE * DE las películas DONDE el título REGEXP 'da *'; le dará todas las películas que contengan los personajes "da". Por ejemplo, Código Da Vinci, Las niñas de papá. | |
+ | El metacarácter más (+) se usa para hacer coincidir una o más instancias de cadenas que lo preceden. | SELECCIONAR * DE `películas` DONDE` título` REGEXP 'mon +'; le dará a todas las películas que contengan caracteres "mon". Por ejemplo, Ángeles y Demonios. | |
? | El metacarácter de pregunta (?) Se usa para hacer coincidir cero (0) o una instancia de las cadenas que lo preceden. | SELECCIONAR * DE `categorías` DONDE` nombre_categoría` REGEXP 'com?'; dará todas las categorías que contienen comedia de cadena. Por ejemplo, comedia, comedia romántica. | |
. | El metacarácter de punto (.) Se utiliza para hacer coincidir cualquier carácter individual a excepción de una nueva línea. | SELECCIONE * DE películas DONDE `year_released` REGEXP '200.'; le dará todas las películas lanzadas en los años comenzando con los caracteres "200" seguidos de cualquier carácter individual. Por ejemplo, 2005,2007,2008 etc. | |
[a B C] | La lista de caracteres [abc] se utiliza para coincidir con cualquiera de los caracteres incluidos. | SELECCIONAR * DE `películas` DONDE` título` REGEXP '[vwxyz]'; dará todas las películas que contengan un solo carácter en "vwxyz". Por ejemplo, X-Men, Da Vinci Code, etc. | |
[abc] | La lista de caracteres [abc] se usa para hacer coincidir cualquier carácter, excepto los incluidos. | SELECCIONAR * DE `películas` DONDE` título` REGEXP '[vwxyz]'; dará todas las películas que contengan personajes distintos a los de "vwxyz". | |
[ARIZONA] | La [AZ] se utiliza para coincidir con cualquier letra mayúscula. | SELECT * FROM `miembros` DONDE` postal_address` REGEXP '[AZ]'; dará a todos los miembros que tengan una dirección postal que contenga cualquier carácter de la A a la Z ... Por ejemplo, Janet Jones con el número de membresía 1. | |
[Arizona] | La [az] se utiliza para coincidir con cualquier letra minúscula. | SELECCIONAR * DE `miembros` DONDE` postal_address` REGEXP '[az]'; le dará a todos los miembros que tengan direcciones postales que contengan cualquier carácter de la a a la z… Por ejemplo, Janet Jones con el número de membresía 1. | |
[0-9] | El [0-9] se utiliza para hacer coincidir cualquier dígito del 0 al 9. | SELECT * FROM `members` WHERE` contact_number` REGEXP '[0-9]' dará todos los miembros que han enviado números de contacto que contienen los caracteres "[0-9]". Por ejemplo, Robert Phil. | |
^ | El signo de intercalación (^) se utiliza para iniciar la coincidencia desde el principio. | SELECCIONAR * DE `películas` DONDE` título` REGEXP '[cd]'; da todas las películas con el título que comienza con cualquiera de los personajes en "cd". Por ejemplo, Nombre en clave Black, Daddy's Little Girls y Da Vinci Code. | |
| | La barra vertical (|) se utiliza para aislar alternativas. | SELECCIONAR * DE `películas` DONDE` título` REGEXP '[cd] | [u]'; da todas las películas con el título que comienza con cualquiera de los personajes en "cd" o "u". Por ejemplo, Nombre en clave Black, Daddy's Little Girl, Da Vinci Code y Underworld - Awakening. | |
[[: <:]] | El [[: <:]] coincide con el comienzo de las palabras. | SELECCIONAR * DE `películas` DONDE` título` REGEXP '[[: <:]] para'; da todas las películas con títulos que comienzan con los personajes. Por ejemplo: Olvidar a Sarah Marshal. | |
[[:>:]] | El [[:>:]] coincide con el final de las palabras. | SELECCIONAR * DE `películas` DONDE` título` REGEXP 'ack [[:>:]]'; da todas las películas con títulos que terminan con los caracteres "ack". Por ejemplo, Nombre de código Negro. | |
[:clase:] | El [: clase:] coincide con una clase de caracteres es decir [: alpha:] para que coincida con las letras, [: space:] para que coincida con el espacio en blanco, [: punct:] es signos de puntuación de los partidos y [: upper:] para las letras de la clase alta. | SELECCIONE * DE `películas` DONDE` título` REGEXP '[: alpha:]'; indica que todas las películas cuyos títulos solo contienen letras. Por ejemplo, Olvidar a Sarah Marshal, X-Men, etc. Esta consulta omitirá películas como Piratas del Caribe 4. |
La barra invertida (\) se utiliza como carácter de escape. Si queremos usarlo como parte del patrón en una expresión regular, debemos usar barras invertidas dobles (\\)
Resumen
- Las expresiones regulares proporcionan una coincidencia de patrones potente y flexible que puede ayudarnos a implementar utilidades de búsqueda de energía para nuestros sistemas de base de datos.
- REGEXP es el operador que se utiliza al realizar coincidencias de patrones de expresión regular. RLIKE es el sinónimo
- Las expresiones regulares admiten una serie de metacaracteres que permiten una mayor flexibilidad y control al realizar coincidencias de patrones.
- La barra invertida se utiliza como carácter de escape en expresiones regulares. Solo se considera en la coincidencia de patrones si se han utilizado barras diagonales inversas dobles.
- Las expresiones regulares no distinguen entre mayúsculas y minúsculas.