Expresiones regulares en MySQL
En MySQL pueden usarse expresiones regulares mediante el operador
:
^
Comienzo de una cadena.
mysql> SELECT 'fo\nfo' REGEXP '^fo$'; -> 0
mysql> SELECT 'fofo' REGEXP '^fo'; -> 1
$
Final de una cadena.
mysql> SELECT 'fo\no' REGEXP '^fo\no$'; -> 1
mysql> SELECT 'fo\no' REGEXP '^fo$'; -> 0
.
Cualquier caracter (incluído line feed y carriage return).
mysql> SELECT 'fofo' REGEXP '^f.*$'; -> 1
mysql> SELECT 'fo\r\nfo' REGEXP '^f.*$'; -> 1
a*
Secuencia de cero o más caracteres.
mysql> SELECT 'Ban' REGEXP '^Ba*n'; -> 1
mysql> SELECT 'Baaan' REGEXP '^Ba*n'; -> 1
mysql> SELECT 'Bn' REGEXP '^Ba*n'; -> 1
a+
Secuencia de uno o más caracteres.
mysql> SELECT 'Ban' REGEXP '^Ba+n'; -> 1
mysql> SELECT 'Bn' REGEXP '^Ba+n'; -> 0
a?
Cero o un caracter.
mysql> SELECT 'Bn' REGEXP '^Ba?n'; -> 1
mysql> SELECT 'Ban' REGEXP '^Ba?n'; -> 1
mysql> SELECT 'Baan' REGEXP '^Ba?n'; -> 0
de|abc
Operador lógico OR. Cualquiera de las secuencias ‘de’ o ‘abc’.
mysql> SELECT 'pi' REGEXP 'pi|apa'; -> 1
mysql> SELECT 'axe' REGEXP 'pi|apa'; -> 0
mysql> SELECT 'apa' REGEXP 'pi|apa'; -> 1
mysql> SELECT 'apa' REGEXP '^(pi|apa)$'; -> 1
mysql> SELECT 'pi' REGEXP '^(pi|apa)$'; -> 1
mysql> SELECT 'pix' REGEXP '^(pi|apa)$'; -> 0
(abc)*
Match de una o más instancias de la secuencia ‘abc’.
mysql> SELECT 'pi' REGEXP '^(pi)*$'; -> 1
mysql> SELECT 'pip' REGEXP '^(pi)*$'; -> 0
mysql> SELECT 'pipi' REGEXP '^(pi)*$'; -> 1
{1}, {2,3}
La notación
o
provee una forma más general en la cual hacer match de varias ocurrencias del pattern que precede, donde m indica cantidad mínima de ocurrencias y n indica máxima. Ambos valores son enteros.
Puede escribirse como
.
Puede escribirse como
.
Puede escribirse como
.
Para ser más precisos,
hace match de, exactamente, n instancias de a.
hace match de n o más instancias de a.
hace match de entre m y n instancias de a, donde m y n están incluídos.
m y n deben estar en el rango desde 0 a
(default 255), inclusive. Si se especifican ambos valores (m y n), m debe ser menor o igual a n.
mysql> SELECT 'abcde' REGEXP 'a[bcd]{2}e'; -> 0
mysql> SELECT 'abcde' REGEXP 'a[bcd]{3}e'; -> 1
mysql> SELECT 'abcde' REGEXP 'a[bcd]{1,10}e'; -> 1
[a-dX], [^a-dX]
Match de cualquier caracter perteneciente al rango a-dX (a, b, c, d, X) y en el caso que el rango sea precedido por
equivale a cualquier caracter que no corresponda con dicho rango. Por ejemplo,
hace match de cualquier dígito decimal, mientras que
de cualquier caracter no decimal.
mysql> SELECT 'aXbc' REGEXP '[a-dXYZ]'; -> 1
mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]$'; -> 0
mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]+$'; -> 1
mysql> SELECT 'aXbc' REGEXP '^[^a-dXYZ]+$'; -> 0
mysql> SELECT 'gheis' REGEXP '^[^a-dXYZ]+$'; -> 1
mysql> SELECT 'gheisa' REGEXP '^[^a-dXYZ]+$'; -> 0
[.characters.]
Esta expresión permite hacer match de un caracter mediante su nombre, como por ejemplo
en lugar de \n. La lista completa puede encontrarse en regexp/cname.h file.
mysql> SELECT '~' REGEXP '[[.~.]]'; -> 1
mysql> SELECT '~' REGEXP '[[.tilde.]]'; -> 1
[:character_class:]
MySQL, como tantos otros lenguajes que implementan expresiones regulares, incluye una serie de alias para denominar clases de caracteres. La siguiente tabla es una lista de las clases y sus nombres.
| alnum | Alphanumeric characters |
| alpha | Alphabetic characters |
| blank | Whitespace characters |
| cntrl | Control characters |
| digit | Digit characters |
| graph | Graphic characters |
| lower | Lowercase alphabetic characters |
| Graphic or space characters | |
| punct | Punctuation characters |
| space | Space, tab, newline, and carriage return |
| upper | Uppercase alphabetic characters |
| xdigit | Hexadecimal digit characters |
mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+'; -> 1
mysql> SELECT '!!' REGEXP '[[:alnum:]]+'; -> 0
[[:<:]], [[:>:]]
Estos marcadores son usados para marcar límites de palabras. Ellos hacen match del comienzo y final de una palabra, respectivamente. Una palabra es una secuencia de caracteres pertenecientes a la clase
(alphanumeric) y al caracter underscore (_). La definición de palabra dice también que dicha secuencia no debe ser precedida o seguida de ningún caracter de los mencionados.
mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; -> 1
mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]'; -> 0
\
Para hacer que los caracteres especiales pierdan su significado deben ser precedidos por dos backslash (\). El analizador de MySQL interpreta uno de los \ y la librería de expresiones regulares el otro. Por ejemplo, para hacer un match de la cadena ‘1+2′ la cual contiene el caracter especial +, sólo la última expresión regular es correcta:
mysql> SELECT '1+2' REGEXP '1+2'; -> 0
mysql> SELECT '1+2' REGEXP '1\+2'; -> 0
mysql> SELECT '1+2' REGEXP '1\\+2'; -> 1
=0, =1
Invertir el match de una regex es tan simple como comparar el resultado con 1 o 0. En el ejemplo se muestra primero el resultado de una consulta simple, luego sólo los registros que contengan el caracter ‘5′ y finalmente se invierte el filtro. También funciona con true y false
mysql> SELECT link_url FROM wp_links;
+------------------------------+
| link_url |
+------------------------------+
| http://barrapunto.com |
| http://www.microsiervos.com/ |
| http://www.kriptopolis.org/ |
| http://meneame.net/ |
| http://www.error500.net/ |
| http://slashdot.org |
| http://astroseti.org/ |
+------------------------------+
mysql> SELECT link_url FROM wp_links WHERE link_url REGEXP '5';
+--------------------------+
| link_url |
+--------------------------+
| http://www.error500.net/ |
+--------------------------+
mysql> SELECT link_url FROM wp_links WHERE link_url REGEXP '5'=0;
+------------------------------+
| link_url |
+------------------------------+
| http://barrapunto.com |
| http://www.microsiervos.com/ |
| http://www.kriptopolis.org/ |
| http://meneame.net/ |
| http://slashdot.org |
| http://astroseti.org/ |
+------------------------------+





