H Description des expressions régulières sous MySQL

Une expression régulière (regex) est une méthode puissante de rechercher des valeurs complexes.

MySQL utilise l'implémentation de Henry Spencer's. Cela permet d'être compatible avec POSIX 1003.2. MySQL utilise la version étendue.

Ce chapitre est une approche très simplifiée. Pour avoir tous les détails, allez sur le manuel d'Henry Spencer regex(7) qui est inclus dans la distribution. C Contributions à MySQL.

Une expression régulière décrit un ensemble de chaînes. L'expression régulière la plus simple est celle qui ne contient aucun caractère spécial. Par exemple, bonjour correspond à bonjour et rien d'autre.

Les expressions régulières non triviales utilisent certains caractères spéciaux, ce qui leur permet de décrire plusieurs chaînes. Par exemple, l'expression régulière bonjour|le|monde correspond soit à bonjour, soit à le ou encore à monde

Comme exemple plus complexe, la regexp B[an]*es correspond à Bananes, Baaaaaes, Bes, Bans et n'importe quelle autre chaîne qui commence par B, finit par es, et contient des a et n entre.

Une expression régulière peut contenir les caractères spéciaux suivants: caractères/explication:

^
Le début de la chaîne.
mysql> select "fo\nfo" REGEXP "^fo$";           -> 0
mysql> select "fofo" REGEXP "^fo";              -> 1
$
La fin de la chaîne.
mysql> select "fo\no" REGEXP "^fo\no$";         -> 1
mysql> select "fo\no" REGEXP "^fo$";            -> 0
.
N'importe quel caractère (y compris les nouvelles lignes)
mysql> select "fofo" REGEXP "^f.*";             -> 1
mysql> select "fo\nfo" REGEXP "^f.*";           -> 1
a*
N'importe quel nombre de a (0 ou plus).
mysql> select "Ban" REGEXP "^Ba*n";             -> 1
mysql> select "Baaan" REGEXP "^Ba*n";           -> 1
mysql> select "Bn" REGEXP "^Ba*n";              -> 1
a+
N'importe quel nombre de a existants (1 ou plus).
mysql> select "Ban" REGEXP "^Ba+n";             -> 1
mysql> select "Bn" REGEXP "^Ba+n";              -> 0
a?
La présence ou l'absence de a (0 ou 1).
mysql> select "Bn" REGEXP "^Ba?n";              -> 1
mysql> select "Ban" REGEXP "^Ba?n";             -> 1
mysql> select "Baan" REGEXP "^Ba?n";            -> 0
de|abc
Alternative : soit de, soit 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)*
N'importe quel nombre de fois la séquence entre parenthèses.
mysql> select "pi" REGEXP "^(pi)+$";            -> 1
mysql> select "pip" REGEXP "^(pi)+$";           -> 0
mysql> select "pipi" REGEXP "^(pi)+$";          -> 1
{1}
{2,3}
Une façon plus générale de quantifier un atome
a*
Peut s'écrire a{0,}.
a+
Peut s'écrire a{1,}.
a?
Peut s'écrire a{0,1}.
Pour être plus précis, un atome suivi par une limite, contenant un entier i et aucune virgule, remplace n'importe quelle séquence de i fois l'atome. Un atome suivi par une limite, contenant un entier i et une virgule, remplace n'importe quelle séquence de i fois ou plus l'atome. Un atome suivi par une limite, contenant un entier i et une virgule et un autre entier j, remplace n'importe quelle séquence de i à j (inclus) fois l'atome. Les deux arguments doivent être 0 >= value <= RE_DUP_MAX (default 255). Si il y a deux arguments, le second doit être supérieur au premier.
[a-dX]
[^a-dX]
Correspond à n'importe quel caractère qui est (ou n'est pas, si ^ est utilisé) soit a, b, c, d or X. Pour inclure le caractère litéral ], il doit être placé juste après le crochet ouvrant. Pour inclure le caractère litéral - character, il doit être en premier ou en dernier. De cette façon, [0-9] correspond à tous les chiffres. Tous les autres caractères qui n'ont aucune signification entre [] ne fait que se remplacer lui même.
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.]]
La séquence entre crochés imbriqués sont traités comme une seule élément du crochet père. Ainsi, pour ch l'expressions régulière [[.ch.]]*c correspond bien à chchcc.
[=character-class=]
Une classe d'équivalence, qui remplace tous les éléments équivalent, y compris lui même. Par exemple, si o et (+) sont membre d'une classe d'équivalence, alors [[=o=]], [[=(+)=]], et [o(+)] sont synonymes. Une classe d'équivalence ne peut pas être la fin d'un intervalle.
[:character_class:]
Le nom de la classe de caractères entre [: et :] correspond à la liste de tous les caractères de cette classe. Les noms de classes sont :
alnum digit punct
alpha graph space
blank lower upper
cntrl print xdigit
Ils correspondent aux classes de caractères défini à la page ctype(3) du manuel. Localement, on peut disposer d'autres classes. Une classe de caractère ne peut pas être utilisé comme extrémité d'intervalle.
mysql> select "justalnums" REGEXP "[[:alnum:]]+";       -> 1
mysql> select "!!" REGEXP "[[:alnum:]]+";               -> 0
[[:<:]]
[[:>:]]
Ces séquences remplacent la chaîne NULL au début et à la fin d'un mot, respectivement. Un mot est défini comme une séquence de caractères de mot qui ne sont ni suivi ni précédé d'autres caractères de mot. Un caracètre de mot est un caractère alpha numérique (comme défine par ctype(3)) et l'underscore (_).
mysql> select "a word a" REGEXP "[[:<:]]word[[:>:]]";      -> 1
mysql> select "a xword a" REGEXP "[[:<:]]word[[:>:]]";     -> 0
mysql> select "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -> 1