Manuel de Référence MySQL 4.1 : Version Française
. Informations générales . Installation de MySQL . Tutoriels d'introduction . Administration du serveur . Optimisation de MySQL . Référence du langage MySQL . Types de tables MySQL . Les interfaces pour MySQL . Etendre MySQL . Problèmes et erreurs communes . Contributions . Crédits . Historique des changements MySQL . Port vers d'autres systèmes . Variables d'environnement ->Expressions régulières MySQL . Licence Publique Générale GNU . Licence Publique Générale GNU Limitée . Index des commandes, types et fonctions SQL . Index conceptuel
|
16 Expressions régulières MySQL
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. Contributeurs .
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 :
-
^
-
Correspond au début de la chaîne.
mysql> SELECT "fo\nfo" REGEXP "^fo$"; -> 0 mysql> SELECT "fofo" REGEXP "^fo"; -> 1
|
-
$
-
Correspond à 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 (nouvelle ligne inclus).
mysql> SELECT "fofo" REGEXP "^f.*"; -> 1 mysql> SELECT "fo\nfo" REGEXP "^f.*"; -> 1
|
-
a*
-
Correspond à toute séquence de zéro ou plus caractères
a
.
mysql> SELECT "Ban" REGEXP "^Ba*n"; -> 1 mysql> SELECT "Baaan" REGEXP "^Ba*n"; -> 1 mysql> SELECT "Bn" REGEXP "^Ba*n"; -> 1
|
-
a+
-
Correspond à toute séquence de un ou plus caractères
a
.
mysql> SELECT "Ban" REGEXP "^Ba+n"; -> 1 mysql> SELECT "Bn" REGEXP "^Ba+n"; -> 0
|
-
a?
-
Correspond à zéro ou un caractère
a
.
mysql> SELECT "Bn" REGEXP "^Ba?n"; -> 1 mysql> SELECT "Ban" REGEXP "^Ba?n"; -> 1 mysql> SELECT "Baan" REGEXP "^Ba?n"; -> 0
|
-
de|abc
-
Correspond aux séquences de
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)*
-
Correspond à zéro ou plus séquences de
abc
.
mysql> SELECT "pi" REGEXP "^(pi)*$"; -> 1 mysql> SELECT "pip" REGEXP "^(pi)*$"; -> 0 mysql> SELECT "pipi" REGEXP "^(pi)*$"; -> 1
|
-
{1}
-
-
{2,3}
-
Voici une façon plus générale d'écrire les regexps qui correspondent à
plusieurs occurences du dernier atome.
-
a*
-
Peut être écrit
a{0,}
.
-
a+
-
Peut être écrit
a{1,}
.
-
a?
-
Peut être écrit
a{0,1}
.
Pour être plus précis, un atome suivi d'une accolade contenant un entier
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]
-
Trouve n'importe quel caractère qui est (ou n'est pas, si ^ est utilisé)
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.]]
-
La séquence de caractères de cet élément d'assemblage. La séquence est un élément
de la liste contenue entre les crochets. Une telle expression contenant un élément
d'assemblage multi-caractères peut ainsi trouver plus d'un caractère.
Par exemple, si la séquence d'assemblage inclut un élément
ch
, alors l'expression
regulière
[[.ch.]]*c
trouve les cinq premiers caractères de
chchcc
.
-
[=character_class=]
-
Une classe d'équivalence, remplaçant les séquences de caractères de tous les éléments de
l'assemblage équivalents à celui-ci, lui même inclut.Par exemple, si
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:]
-
Dans une expression entre crochets, le nom d'une classe de caractères entourée de
[:
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 |
print |
xdigit
|
Voilà les classes de caractères définies dans la page de manuel
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
|
-
[[:<:]]
-
-
[[:>:]]
-
Ceux là trouvent la chaîne nulle qui précède et suit chaque mot. Un mot est
défini comme étant une séquence de caractères qui n'est ni suivi ni précédée d'un
caractère de mot. Un caractère de mot est un caractère alnum (défini par
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
|
|