Las expresiones regulares permiten especificar un patrón para una búsqueda compleja.
MySQL usa la implementación de expresiones regulares de Henry Spencer,
que es conforme con POSIX 1003.2. Ver
Apéndice B, Credits. MySQL usa la versión extendida para
soportar operaciones de concordancia de patrones, a través del operador
REGEXP
en sentencias SQL. Ver
Sección 3.3.4.7, “Coincidencia de patrones”.
Este apéndice es un resumen, con ejemplos, de caracteres especiales
y constructores que se pueden utilizar en MySQL para las operaciones
REGEXP
. No contiene todos los detalles que se pueden
encontrar en la página del manual de regex(7)
de Henry Spencer.
Dicho manual se incluye en el código fuente de MySQL, en el archivo
regex.7
dentro del directorio
regex
.
Una expresión regular describe una serie de cadenas. La expresión regular
más simple es aquella que no tiene caracteres especiales en su interior.
Por ejemplo, la expresión regular hola
concuerda con
hola
y nada más.
Una expresión regular no trivial usa ciertos constructores especiales,
que pueden concordar más de en una cadena. Por ejemplo, la
expresión regular hello|word
concuerda tanto con la
cadena hello
como con la cadena word
.
Un ejemplo más complicado: la expresión regular
B[an]*s
concuerda con las cadenas
Bananas
, Baaaaas
,
Bs
, y cualquier otra cadena que comience con una
B
, termine con unas
y
contenga cualquier número de caracteres a
o
n
entre ellas.
Una expresión regular para el operador REGEXP
puede
utilizar cualquiera de los siguientes caracteres especiales y constructores:
^
que concuerda con el inicio de la cadena.
mysql> SELECT 'fo\nfo' REGEXP '^fo$'; -> 0 mysql> SELECT 'fofo' REGEXP '^fo'; -> 1
$
que concuerda con el final de la cadena.
mysql> SELECT 'fo\no' REGEXP '^fo\no$'; -> 1 mysql> SELECT 'fo\no' REGEXP '^fo$'; -> 0
.
que concuerda con cualquier carácter (incluyendo el retorno de carro y la nueva línea).
mysql> SELECT 'fofo' REGEXP '^f.*$'; -> 1 mysql> SELECT 'fo\r\nfo' REGEXP '^f.*$'; -> 1
a*
que concuerda con cualquier secuencia de cero o más caracteres
a
.
mysql> SELECT 'Ban' REGEXP '^Ba*n'; -> 1 mysql> SELECT 'Baaan' REGEXP '^Ba*n'; -> 1 mysql> SELECT 'Bn' REGEXP '^Ba*n'; -> 1
a+
que concuerda con cualquier secuencia de uno o más caracteres
a
.
mysql> SELECT 'Ban' REGEXP '^Ba+n'; -> 1 mysql> SELECT 'Bn' REGEXP '^Ba+n'; -> 0
a?
que concuerda con cero o un carácter a
.
mysql> SELECT 'Bn' REGEXP '^Ba?n'; -> 1 mysql> SELECT 'Ban' REGEXP '^Ba?n'; -> 1 mysql> SELECT 'Baan' REGEXP '^Ba?n'; -> 0
de|abc
que concuerda tanto con la secuencia de
como con
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)*
que concuerda con cero 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 manera más general de escribir expresiones regulares
que concuerden con varias instancias del átomo anterior (o
“pieza”) del patrón. m
y
n
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 preciso, a{n}
concuerda exactamente
con n
instancias de a
.
a{n,}
concuerda con n
o más
instancias de a
. a{m,n}
concuerda con entre m
y n
(inclusive)
instancias de a
.
m
y n
deben estar en el rango
desde 0
hasta RE_DUP_MAX
(255 por defecto). Si se especifican 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]
Concuerda con cualquier caracter que sea (o no sea, si se utiliza ^ )
uno de los siguientes:
a
, b
,
c
, d
o
X
. Un carácter -
entre
dos caracteres distintos forma un rango que concuerda con cualquier
carácter entre el primero y el segundo. Por ejemplo,
[0-9]
concuerda con cualquier dígito decimal.
Para incluir un carácter ]
literal, debe estar
precedido inmediatamente por un corchete abierto [
.
Para incluir un carácter -
literal , debe estar
al principio o al final. Cualquier carácter que no tenga un
significado especial, concuerda sólo consigo mismo si está dentro
de un par de []
.
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.]
Dentro de una expresión de corchetes (escrita usando [
y ]
), concuerda con la sencuencia de caracteres
expresada. characters
es cualquier
carácter simple o su nombre de carácter como
newline
. Se puede encontrar la lista completa
de nombres de caracteres en el archivoregexp/cname.h
.
mysql> SELECT '~' REGEXP '[[.~.]]'; -> 1 mysql> SELECT '~' REGEXP '[[.tilde.]]'; -> 1
[=character_class=]
Dentro de una expresión de corchetes (escrita usando [
y ]
),
[=character_class=]
representa una clase de equivalencia.
Concuerda con cualquier carácter con el mismo valor de comparación.
Por ejemplo, si o
y
(+)
son miembros de una clase equivalente,
entonces [[=o=]]
, [[=(+)=]]
,
y [o(+)]
son todos sinónimos. Una clase equivalente
no puede utilizarse como el final de un rango.
[:character_class:]
Dentro de una expresión de corchetes (escrita usando [
y ]
),
[:character_class:]
representa una clase de caracteres
que concuerda con todos los caracteres pertenecientes a esa clase.
Los nombres de clases estándar son:
alnum | Caracteres alfanumericos |
alpha | Caracteres Alfabéticos |
blank | Caracteres espacios en blanco |
cntrl | Caracteres de Control |
digit | Caracteres Dígitos |
graph | Caracteres gráficos |
lower | Caracteres alfabéticos en minúsculas |
print | Caracteres gráficos o espacios |
punct | Caracteres de puntación |
space | Espacio, tabulador, nueva línea y retorno de carro |
upper | Caracteres alfabéticos en mayúsculas |
xdigit | Caracteres dígitos en hexadecimal |
Estos nombres representan las clases de caracteres definidas en
ctype(3)
. Una localización particular pudiera proveer
otros nombres de clases. Una clase de caracteres no se puede
utilizar como final de un rango.
mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+'; -> 1 mysql> SELECT '!!' REGEXP '[[:alnum:]]+'; -> 0
[[:<:]]
, [[:>:]]
Estos marcadores representan limitadores de palabras. Concuerdan con el
inicio y el final de palabras, respectivamente. Una palabra es una
secuencia de caracteres de palabra que no son precedidos ni
seguidos por caracteres de palabra.
Un carácter de palabra es un carácter alfanumerico en la clase
alnum
o un guión bajo (_
).
mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; -> 1 mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]'; -> 0
Para utilizar en una expresión regular un carácter especial literalmente,
precédalo con dos barras invertidas (\). El parser de MySQL interpreta las
barras invertidas, y la biblioteca de expresiones regulares interpreta el
resto. Por ejemplo, para concordar con 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
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.