Une expression régulière (regex) est la meilleure méthode pour spécifier une recherche complexe.
MySQL utilise l'implémentation de Henry Spencer des expressions régulières qui tend à être conforme à POSIX 1003.2. MySQL en utilise la version étendue.
Ceci est une référence simplifiée qui n'aborde pas les détails. Pour avoir
plus d'ionformations détaillées, regardez la page de manuel regex(7)
de Henry Spencer qui est inclue dans la distribution des sources. See section B Crédits.
Une expression régulière décrit un jeu de chaînes de caractères. La plus simple
est celle qui ne comporte pas de caractères spéciaux. Par exemple, la regexp
bonjour trouvera bonjour et rien d'autre.
Les expression régulières non-trivialles utilisent des constructions spéciales
pour pouvoir trouver plus d'une chaîne. Par exemple, la regexp bonjour|monde
trouve la chaîne bonjour ou la chaîne monde.
Voici un exemple encore plus complexe : la regexp B[an]*s trouve l'une des chaînes
suivantes Bananas, Baaaaas, Bs, et n'importe quelle autre chaîne commençant
par un B, se terminant par un s, et contenant n'importe quel nombre de a et
de n au milieu.
Une expression régulière peut utiliser l'un des caractères spéciaux ou constructions suivants :
^
mysql> SELECT "fo\nfo" REGEXP "^fo$"; -> 0 mysql> SELECT "fofo" REGEXP "^fo"; -> 1
$
mysql> SELECT "fo\no" REGEXP "^fo\no$"; -> 1 mysql> SELECT "fo\no" REGEXP "^fo$"; -> 0
.
mysql> SELECT "fofo" REGEXP "^f.*"; -> 1 mysql> SELECT "fo\nfo" REGEXP "^f.*"; -> 1
a*
a.
mysql> SELECT "Ban" REGEXP "^Ba*n"; -> 1 mysql> SELECT "Baaan" REGEXP "^Ba*n"; -> 1 mysql> SELECT "Bn" REGEXP "^Ba*n"; -> 1
a+
a.
mysql> SELECT "Ban" REGEXP "^Ba+n"; -> 1 mysql> SELECT "Bn" REGEXP "^Ba+n"; -> 0
a?
a.
mysql> SELECT "Bn" REGEXP "^Ba?n"; -> 1 mysql> SELECT "Ban" REGEXP "^Ba?n"; -> 1 mysql> SELECT "Baan" REGEXP "^Ba?n"; -> 0
de|abc
de ou de 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)*
abc.
mysql> SELECT "pi" REGEXP "^(pi)*$"; -> 1 mysql> SELECT "pip" REGEXP "^(pi)*$"; -> 0 mysql> SELECT "pipi" REGEXP "^(pi)*$"; -> 1
{1}
{2,3}
a*
a{0,}.
a+
a{1,}.
a?
a{0,1}.
i et pas de virgule trouve une séquence de exactement i
atomes.
Un atome suivi d'une accolade contenant un entier i et une virgule
trouve une séquence de i ou plus atomes.
Un atome suivi d'une accolade contenant deux entiers i et j
séparés d'une virgule trouve les séquences de i à j (inclusif)
atomes.
Les deux arguements doivent être compris entre 0 et RE_DUP_MAX
(par défaut 255), inclusif. S'il y a deux arguements, le second doit être supérieur
ou égal au premier.
[a-dX]
[^a-dX]
a, b,
c, d ou X. Pour inclure le caractère litéral ],
il doit suivre immédiatement le crochet ouvrant [. Pour inclure le caractère litéral
-, il doit être écrit en premier ou en dernier. Ce qui fait que
[0-9] correspond à n'importe quel chiffre. Chaque caractère qui n'a pas de signification
spéciale à l'intérieur une paire de [] ne joue pas de rôle spécial et ne correspond qu'à
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
[[.charactères.]]
ch, alors l'expression
regulière [[.ch.]]*c trouve les cinq premiers caractères de chchcc.
[=character_class=]
o et (+) sont membres d'une classe d'équivalence, alors
[[=o=]], [[=(+)=]], et [o(+)] sont tous des synonymes. Une classe
d'équivalence ne doit pas être un point final d'intervalle.
[:classe_de_caractères:]
[:
et :] remplace la liste de tous les caractères appartenant à cette classe. Les noms
des classes de caractères sont :
| Nom | Nom | Nom |
| alnum | digit | punct |
| alpha | graph | space |
| blank | lower | upper |
| cntrl | xdigit |
ctype(3).
Une locale peut en fournir d'autres. Une classe de caractère ne doit pas être utilisée
en tant que point final d'intervalle.
mysql> SELECT "justalnums" REGEXP "[[:alnum:]]+"; -> 1 mysql> SELECT "!!" REGEXP "[[:alnum:]]+"; -> 0
[[:<:]]
[[:>:]]
ctype(3))
ou un tiret bas (_).
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
Go to the first, previous, next, last section, table of contents.