Apendice C Expresiones regulares

Este apéndice es una traducción del manual de MySQL.

Una expresión regular es una forma muy potente de especificar un patrón para una búsqueda compleja.

MySQL usa la impementación de Henry Spencer para expresiones regulares, que ha sido ajustado para ceñirse a POSIX 1003.2. MySQL usa una versión extendida para soportar operaciones de coincidencia de patrones realizadas con el operador REGEXPen sentencias SQL.

Este apéndice es un resumen, con ejemplos, de las características especiales y de las construcciones que pueden ser usadas en MySQL para operaciones REGEXP. No contiene todos los detalles que pueden ser encontrados en el manual de regex(7) de Henry Spencer. Dicho manual está incluido en las distribuciones fuente de MySQL, en el fichero 'regex.7' bajo el directorio 'regex'.

Una expresión regular describe un conjunto de cadenas. La expresión regular más sencilla es aquella que no contiene caracteres especiales. Por ejemplo, la expresión regular "hola" coincide con "hola" y con nada más.

Las expresiones regulares no triviales usan ciertas construcciones especiales de modo que pueden coincidir con más de una cadena. Por ejemplo, la expresión regular "Hola|mundo" coincide tanto con la cadena "Hola" como con la cadena "mundo".

Como ejemplo algo más complejo, la expresión regular "B[an]*s" coincide con cualquiera de las cadenas siguientes "Bananas", "Baaaaas", "Bs", y cualquier otra cadena que empiece con 'B', termine con 's', y contenga cualquier número de caracteres 'a' o 'n' entre la 'B' y la 's'.

Una expresión regular para el operador REGEXP puede usar cualquiera de los siguientes caracteres especiales u contrucciones:

^

Coincidencia del principio de una cadena.

mysql> SELECT 'fo\nfo' REGEXP '^fo$';                   -> 0
mysql> SELECT 'fofo' REGEXP '^fo';                      -> 1

$

Coincidencia del final de una cadena.

mysql> SELECT 'fo\no' REGEXP '^fo\no$';                 -> 1
mysql> SELECT 'fo\no' REGEXP '^fo$';                    -> 0

.

Coincidencia de culaquier carácter (incluyendo los de avance o el retorno de línea).

mysql> SELECT 'fofo' REGEXP '^f.*$';                    -> 1
mysql> SELECT 'fo\r\nfo' REGEXP '^f.*$';                -> 1

a*

Coincidencia de cualquier 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+

Coincidencia de cualquier secuencia de uno o más caracteres.

mysql> SELECT 'Ban' REGEXP '^Ba+n';                     -> 1
mysql> SELECT 'Bn' REGEXP '^Ba+n';                      -> 0

a?

Coincidencia de ninguno o de un carácter.

mysql> SELECT 'Bn' REGEXP '^Ba?n';                      -> 1
mysql> SELECT 'Ban' REGEXP '^Ba?n';                     -> 1
mysql> SELECT 'Baan' REGEXP '^Ba?n';                    -> 0

de|abc

Coincidencia de 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)*

Coincidencia de ninguna 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} proporciona una forma más general para escribir expresiones regulares que coincidan con muchas apariciones del átomo o trozo previo del patrón. m y n son enteros.

a*

Puede ser escrito como "a{0,}".

a+

Puede ser escrito como "a{1,}".

a?

Puede ser escrito como "a{0,1}".

Para ser más precisos, "a{n}" coincide exactamente con n instancias de a. "a{n,}" coincide con n o más instancias de a. "a{m,n}" coincide con un número entre m y n de instancias de a, ambos incluidos. m y n deben estar en el rango de 0 a RE_DUP_MAX (por defecto 255), incluidos. Si se dan tanto m como n, m debe ser menor o igual que 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]

Coincidencia de cualquier carácter que sea (o que no sea, si se usa ^) cualquiera entre 'a', 'b', 'c', 'd' o 'X'. Un carácter '-' entre otros dos caracteres forma un rango que incluye todos los caracteres desde el primero al segundo. Por ejemplo, [0-9] coincide con cualquier dígito decimal. Para incluir un carácter ']' literal, debe ser inmediatamente seguido por el corchete abierto '['. Para incluir el carácter '-', debe ser escrito el primero o el último. Cualquier carácter dentro de [], que no tenga definido un significado especial, coincide sólo con él mismo.

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

[.caracteres.]

En el interior de una expresión entre corchetes (escrita usando '[' y ']'), coincide con la secuencia de caracteres el elemento recopilado. "caracteres" puede ser tanto un carácter individual como un nombre de carácter, como newline. Se puede encontrar una lista completa de nombres de caracteres en el fichero 'regexp/cname.h'.

mysql> SELECT '~' REGEXP '[[.~.]]';                     -> 1
mysql> SELECT '~' REGEXP '[[.tilde.]]';                 -> 1

[=clase_carácter=]

En el interior de una expresión entre corchetes (escrita usando '[' y ']'), [=clase_carácter=] representa una equivalencia de clase. Con ella coinciden todos los caracteres con el mismo valor de colección, incluido él mismo. Por ejemplo, si 'o' y '(+)' son miembros de una clase de equivalencia, entonces "[[=o=]]", "[[=(+)=]]" y "[o(+)]" son sinónimos. Una clase de equivalencia no debe ser usada como extremo de un rango.

[:clase_carácter:]

En el interior de una expresión entre corchetes (escrita usando '[' y ']'), [:character_class:] representa una clase de carácteres que coincide con todos los caracteres pertenecientes a esa clase. Los nombres de clases estándar son:

alnum Caracteres alfanuméricos
alpha Caracteres alfabéticos
blank Carácteres espacio
cntrl Caracteres de control
digit Dígitos
graph Caracteres gráficos
lower Caracteres alfabéticos en minúsculas
print Caracteres gráficos o espacios
punct Caracteres de puntuación
space Espacio, tabulador, cambio de línea y retorno de línea
upper Caracteres alfabéticos en mayúsculas
xdigit Dígitos hexadecimales

Estas clases de caracteres están definidos en el manual de ctype(3). Una localización particular puede definir otros nombres de clases. Una clase de carácter no debe ser usada como extremo de un rango.

mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+';       -> 1
mysql> SELECT '!!' REGEXP '[[:alnum:]]+';               -> 0

[[:<:]]
[[:>:]]

Estos marcadores señalan los límites de palabras. Son coincidencias con el principio o final de palabras, respectivamente. Una palabra es una secuencia de caracteres de palabra que no esté precedida o seguida por caracteres de palabra. Un cara´cter de palabra es un carácter alfanumérico de la clase alnum o un carácter de subrayado (_).

mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';   -> 1
mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]';  -> 0

Para usar una instancia literal de un carácter especial en una expresión regular, hay que precederlo por dos caracteres de barra de bajada (\). El analizador sintáctico de MySQL interpreta una de las barras, y la biblioteca de expresiones regulares interpreta la otra. Por ejemplo, para buscar la coincidencia de la cadena "1+2" que contiene el carácter especial '+', sólo la última de las siguientes expresiones regulares 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