Expresiones regulares en MySQL

En MySQL pueden usarse expresiones regulares mediante el operador

REGEXP

:

^

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

{n}

o

{m,n}

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.

a*

Puede escribirse como

a{0,}

.

a+

Puede escribirse como

a{1,}

.

a?

Puede escribirse como

a{0,1}

.

Para ser más precisos,

a{n}

hace match de, exactamente, n instancias de a.

a{n,}

hace match de n o más instancias de a.

a{m,n}

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

RE_DUP_MAX

(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,

[0-9]

hace match de cualquier dígito decimal, mientras que

[^0-9]

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

[.newline.]

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
print 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

alnum

(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&gt; 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&gt; SELECT link_url FROM wp_links WHERE link_url REGEXP '5';
+--------------------------+
| link_url                 |
+--------------------------+
| http://www.error500.net/ |
+--------------------------+
mysql&gt; 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/        |
+------------------------------+

Tags: ,

Leave a Reply