Les expressions régulières, aussi appelées expressions rationnelles, permettent
d'effectuer une recherche dans un texte en spécifiant
un motif de recherche. Ce motif répond à une syntaxe particulière qu'il peut
être intéressant de connaitre si vous désirez comprendre les règles par défaut
de nos logiciels ou si vous désirez créer vos propres règles.
Les
expressions régulières peuvent paraître, au premier abord, complexes et
illisibles, mais vous verrez qu'elles ne le sont pas tant que ça : après la
lecture de ce document et après avoir fait quelques essais, vous maitriserez
suffisamment le sujet pour créer et utiliser des règles vraiment utiles à votre
activité.
Vous pouvez néanmoins utiliser nos logiciels sans vous souciez des
expressions régulières qu'ils gèrent : les règles contenues par défaut sont déjÃ
parfaitement opérationnelles.
Les expressions régulières utilisées dans nos logiciels sont de type
PCRE -Â Perl Compatible Regular Expressions.
1 - Correspondance simple
A moins qu'il ne soit un
méta-caractère (caractère spécial dont la sémantique diffère de
son acceptation "habituelle), un caractère simple correspond à lui-même, en
terme de comparaison.
Une série de caractères correspond donc à la même
série de caractères dans la chaîne analysée. Ainsi le motif "bluh" correspond Ã
"bluh" dans la chaîne analysée.
Vous pouvez obliger les
méta-caractères ou les
séquences d'échappement à être interprétés
littéralement à l'aide d'un spécificateur : la barre oblique inverse "\". Par
exemple : le méta-caractère "^" correspond normalement au début de ligne, mais
"\^" correspond au caractère "^", "\\" correspond à "\" et ainsi de
suite.
Exemples :
| Â Â foobar |
correspondance avec la chaîne 'foobar' |
| Â Â \^FooBarPtr |
correspondance avec la chaîne '^FooBarPtr' |
2 - Séquences d'échappements
Les caractères peuvent être spécifiés avec une
séquence d'échappement : "\n" correspond à une nouvelle ligne,
"\t" à une tabulation, etc... Plus généralement, \xnn, où nn est un nombre
hexadécimal, correspond au caractère ASCII de valeur nn. Si vous avez besoin de
spécifier des caractères étendus (Unicode,...), vous pouvez utiliser "\x{nnnn}",
où "nnnn" est une chaîne numérique hexadécimale.
| Â Â \xnn |
Caractère
hexa avec le code nn |
| Â Â \x{nnnn} |
Caractère hexa avec un code nnnn (un octet pour le texte ordinaire et 2 octets pour l'Unicode) |
| Â Â \t |
Tabulation horizontale (HT/TAB), même chose que \x09 |
| Â Â \n |
Nouvelle ligne (NL), même chose que \x0a |
| Â Â \r |
Retour chariot (CR), même chose que \x0d |
| Â Â \f |
Avance page (FF), même chose que \x0c |
| Â Â \a |
Alarme (bell) (BEL), même chose que \x07 |
| Â Â \e |
Échappement (ESC), même chose que \x1b |
Exemples :
| Â Â foo\x20bar |
correspondance avec 'foo bar' (notez l'espace au milieu).
 |
| Â Â \tfoobar |
correspondance avec 'foobar' précédé d'une tabulation.
 |
3 - Classes de caractères
Vous pouvez spécifier une
classe de caractères
en créant une liste de caractères entre crochets [], auquel cas la
correspondance se fera en incluant
tous les caractères présents dans la
liste.
Si le premier caractère après "[" est "^", la comparaison
s'effectuera de façon
négative, auquel cas la correspondance se fera en
incluant
aucun des caractères présents dans la liste.
Exemples
:
| Â Â foob[aeiou]r |
trouve les chaînes 'foobar', 'foober' etc... Mais pas 'foobbr', 'foobcr'
etc...  |
| Â Â foob[^aeiou]r |
trouve les chaînes 'foobbr', 'foobcr' etc. Mais pas 'foobar', 'foober'
etc...  |
Dans une liste, le caractère "-" est
utilisé pour spécifier une
plage, ainsi a-z représente tous les
caractères entre "a" et "z" ("a" et "z" inclus).
Si vous voulez que "-"
soit membre de la classe, mettez-le au début ou à la fin de la liste, ou alors
placez un spécificateur d'échappement ("\") devant.
Si vous voulez que "]"
soit membre de la classe mettez-le au début de la liste, ou alors placez un
spécificateur d'échappement ("\") devant.
Exemples :
| Â Â [-az] |
correspondance avec 'a', 'z' et '-.' Â |
| Â Â [az-] |
correspondance avec 'a', 'z' et '-.' Â |
| Â Â [a\-z] |
correspondance avec 'a', 'z' et '-.' Â |
| Â Â [a-z] |
correspondance avec les 26 minuscules de 'a' Ã 'z'.
 |
| Â Â [\n-\x0D] |
trouve tous les #10,#11,#12,#13. Â |
| Â Â [\d-t] |
trouve n'importe quel caractère numérique, '-' ou
't'.  |
| Â Â []-a] |
trouve n'importe quel caractère de ']' Ã
'a'.  |
4 - Méta-caractères
Les
méta-caractères sont des caractères
spéciaux qui sont l'essence même des expressions régulières. Il en existe
différents types :
4.1 - Méta-caractères - Séparateurs de ligne
| Â Â ^ |
Début de ligne.  |
| Â Â $ |
Fin de ligne. |
| Â Â \A |
Début de texte.  |
| Â Â \Z |
Fin de texte. Â |
| Â Â . |
N'importe quel caractère dans une
ligne.  |
Le méta-caractère "^" garantit, par défaut, de trouver l'élément seulement s'il est au début de la chaîne ou du texte, le méta-caractère "$" seulement s'il est à la fin. Les séparateurs de ligne inclus dans le texte ne sont pas considérés comme relevant par "^" ou "$" et la recherche n'aboutira pas (pas de correspondance) dans un tel cas.
Vous pouvez néanmoins considérer, et traiter comme telle, une chaîne de plusieurs lignes de texte - auquel cas "^" sera valable après le séparateur de ligne, et "$" sera valable avant un séparateur de ligne - en utilisant le modificateur m.
Les méta-caractères \A et \Z sont comme "^" et "$", excepté qu'ils ne fonctionnent qu'une seule fois pour tout le texte quand le modificateur m est en usage, tandis que "^" et "$" correspondront à chaque séparateur de ligne.
Le méta-caractère "." par défaut correspond à n'importe quel caractère, mais si vous mettez à off le modificateur s, les séparateurs de ligne ne seront plus inclus pour ".".
Le moteur d'expressions régulières des logiciels WebSynaptics fonctionne selon les recommandations unicode pour les séparateurs de lignes :
"^" est le début de la chaîne d'entrée, et si le modificateur m est à On, "^" correspondra à une chaîne suivant n'importe quelle occurrence de \x0D\x0A ou \x0A ou \x0D (en unicode, il en va de même pour \x2028 et \x2029 et \x0B et \x0C et \x85). Notez qu'il n'y a pas de ligne vide dans la séquence \x0D\x0A.
"$" est le début de la chaîne d'entrée, et si le modificateur m est à On, "$" correspondra à une chaîne précédant n'importe quelle occurrence de \x0D\x0A ou \x0A ou \x0D (en unicode, il en va de même pour \x2028 et \x2029 et \x0B et \x0C et \x85). Notez qu'il n'y a pas de ligne vide dans la séquence \x0D\x0A.Â
"." correspond à n'importe quel caractère, mais si le modificateur s est a Off, "." ne correspondra plus à \x0D\x0A et \x0A et \x0D (en unicode, il en va de même pour \x2028 et \x2029 et \x0B et \x0C et \x85).
Notez que "^.*$" (un motif de ligne vide) ne correspond pas à une chaîne vide, mais correspond à une chaîne contenant la séquence \x0A\x0D.
Exemples :
| Â Â ^foobar |
trouve la chaîne 'foobar' seulement si elle commence une
ligne.  |
| Â Â foobar$ |
trouve la chaîne 'foobar' seulement si elle finit une
ligne.  |
| Â Â ^foobar$ |
trouve la chaîne 'foobar' si une ligne ne contient que ce
mot.  |
| Â Â foob.r |
trouve les chaînes comme 'foobar', 'foobbr', 'foob1r' et ainsi de suite.
 |
4.2 - Méta-caractères - Classes prédéfinies
| Â Â \w |
Un caractère alphanumérique (incluant "_").
 |
| Â Â \W |
Un caractère non alphanumérique.  |
| Â Â \d |
Un caractère numérique.  |
| Â Â \D |
Un caractère non numérique.  |
| Â Â \s |
N'importe quel espace (même chose que [ \t\n\r\f]).
 |
| Â Â \S |
Tout ce qui n'est pas un espace.  |
Vous
pouvez utiliser "\w", "\d" et "\s" à l'intérieur d'une
classe de
caractères.
Exemples :
| Â Â foob\dr |
trouve les chaînes comme 'foob1r', 'foob6r', ... Mais pas 'foobar',
'foobbr' ...  |
| Â Â foob[\w\s]r |
trouve les chaînes comme 'foobar', 'foob r', 'foobbr', ... Mais pas
'foob1r', 'foob=r', ...  |
4.3 - Méta-caractères - Mots
| Â Â \b |
correspond à un mot.  |
| Â Â \B |
correspond à tout, sauf à un mot.  |
Un
mot est une chaîne de caractères qui commence par un "\w" et fini par un "\W" ou
inversement.
4.4 - Méta-caractères - Quantificateur
N'importe quel élément d'une expression régulière
peut-être suivi par un
quantificateur. En utilisant un quantificateur
vous pouvez spécifier le nombre d'occurrence de l'élément, que cet élément soit
un
méta-caractère ou une
sous expression.
Â
| Â Â * |
Zéro ou plus ("vorace"), similaire Ã
{0,}. |
| Â Â + |
Un ou plus ("vorace"), similaire Ã
{1,}. |
| Â Â ? |
Zéro or un ("vorace"), similaire à {0,1}. |
| Â Â {n} |
Exactement n fois ("vorace").  |
| Â Â {n,} |
Au moins n fois ("vorace"). Â |
| Â Â {n,m} |
Au moins n fois mais pas plus de m fois ("vorace").
 |
| Â Â *? |
Zéro ou plus ("non-vorace"), similaire Ã
{0,}?. |
| Â Â +? |
Un ou plus ("non-vorace"), similaire Ã
{1,}?. |
| Â Â ?? |
Zéro ou un ("non-vorace"), similaire Ã
{0,1}?. |
| Â Â {n}? |
Exactement n fois ("non-vorace").  |
| Â Â {n,}? |
Au moins n fois ("non-vorace"). Â |
| Â Â {n,m}? |
Au moins n fois mais pas plus de m fois ("non-vorace").
 |
Ainsi, les nombres entourés d'accolades sous
la forme {n,m}, spécifient le minimum (lettre n) et le maximum (lettre m)
d'occurrence de l'élément.
La forme {n} est équivalente à {n,n} et correspond
à exactement à n fois.
La forme {n,} correspond à n ou plus.
Il n'y a
aucune limite quand à la valeur de n et m, mais de grands nombres réclameront
beaucoup plus de mémoire et ralentirons l'analyse.
Si les accolades
apparaissent dans un autre contexte, elles sont traitées comme un caractère
simple.
Exemples :
| Â Â foob.*r |
trouve les chaînes comme 'foobar', 'foobalkjdflkj9r' et
'foobr'.  |
| Â Â foob.+r |
trouve les chaînes comme 'foobar', 'foobalkjdflkj9r' mais pas 'foobr'.
 |
| Â Â foob.?r |
trouve les chaînes comme 'foobar', 'foobbr' et 'foobr', mais pas
'foobalkj9r'. Â |
| Â Â fooba{2}r |
trouve les chaînes comme 'foobaar'.  |
| Â Â fooba{2,}r |
trouve les chaînes comme 'foobaar', 'foobaaar', 'foobaaaar', etc...
 |
| Â Â fooba{2,3}r |
trouve les chaînes comme 'foobaar', ou 'foobaaar', mais pas 'foobaaaar'.
 |
Remarque au sujet des termes
vorace et
non-vorace :Â
vorace permet de collecter, lors de la
correspondance, autant que possible, alors que
non-vorace permet de
collecter, lors de la correspondance, aussi peu que possible. Par exemple, "b+"
et "b*" appliqués à la chaîne "abbbbc" retournent "bbbb", "b+?" retourne "b",
"b*?" retourne une chaîne vide, "b{2,3}?" retourne "bb", "b{2,3}" retourne
"bbb".
Vous pouvez placer
tous les quantificateurs en mode "non-vorace" en utilisant le
modificateur
g.
4.5 - Méta-caractères - Alternatives
Vous
pouvez spécifier des alternatives au sein du motif en utilisant "|" pour
les séparer, ainsi fee|fie|foe correspondra à "fee", "fie", ou "foe" dans la
chaîne analysée (comme f(e|i|o)e le ferait).
La première forme d'alternative
permet de tout inclure, depuis le délimiteur précédent ("(", "[", ou le début du
motif) jusqu'au premier "|", alors que la deuxième forme d'alternative permet
d'inclure du dernier "|" jusqu'au dernier délimiteur. Pour cette raison, il est
une pratique courante d'inclure les alternatives dans des parenthèses, pour
minimiser le risque de confusion.
Les alternatives sont évaluées
de gauche à droite, et la première alternative trouvée pour la correspondance
est celle qui est choisie. Ceci signifie que les alternatives ne sont pas
nécessairement voraces. Par exemple, lorsque vous faites correspondre foo|foot Ã
"barefoot", seule la partie "foo" sera utilisée, car elle est la première
alternative essayée qui correspond exactement à la chaîne analysée (ceci devient
très important lors de l'utilisation du parenthèsage).
Rappelez-vous
aussi que "|" est interprété comme un littéral entre "[]", donc si vous écrivez
[fee|fie|foe], vous rechercherez effectivement [feio|].
Exemples
:
  foo(bar|foo)     trouve
les chaînes comme 'foobar' ou 'foofoo'.
4.6 - Méta-caractères - Sous expressions
Les parenthèses ( ... )
peuvent aussi être utilisées pour construire des
sous expressions
régulières.
Les
sous expressions sont numérotées de gauche Ã
droite selon les ouvertures des parenthèses. La première sous expression à le
numéro 1, la deuxième le numéro 2,... L'expression régulière a, quant à elle, le
numéro 0 - vous pouvez la substituer par '$0' ou
'$&'.
Exemples:
| Â Â (foobar){8,10} |
trouve les chaînes qui contiennent 8, 9 ou 10 instances de 'foobar'.
 |
| Â Â foob([0-9]|a+)r |
trouve les chaînes comme 'foob0r', 'foob1r' , 'foobar', 'foobaar',
'foobaar', etc...  |
4.7 - Méta-caractères - Références arrières
Les
méta-caractères
\1 jusqu'à \9 sont interprétés comme des références arrières. \<n>
correspond à la
sous expression #<n> précédemment
trouvée.
Exemples :
| Â Â (.)\1+ |
trouve les chaînes comme 'aaaa' et 'cc'. |
| Â Â (.+)\1+ |
trouve les chaînes comme 'abab' et '123123'. |
| Â Â (['"]?)(\d+)\1 |
trouve "13" (entre guillemets), ou '4' (en apostrophe) ou 77 (sans guillemet ou apostrophe), etc... |
5 - Modificateurs
Les
modificateurs ont pour but de modifier
le comportement du moteur d'expression régulières.Â
Â
i
| Â |
Rend la correspondance insensible à la casse (utilisation des paramètres
régionaux). Par défaut : Off. |
m
| Â |
Traite les chaînes comme des ligne multiples. Modifie le comportement de "^"
et "$" pour chercher uniquement à partir du début d'une ligne ou à la fin d'une
ligne. Par défaut : Off. |
s
| Â |
Traite les chaînes comme une simple ligne de texte. Change le comportement
de "." pour qu'il corresponde à n'importe quel caractère, même un séparateur de
ligne (voir aussi Séparateur de Ligne), normalement il ignorerait les sauts de
ligne. Par défaut : Off.  |
g
| Â |
Modificateur non standard. En le mettant à On vous passez tous les
opérateurs en mode vorace. Si le modificateur g est à Off, alors '+'
fonctionne comme '+?', '*' comme '*?' et ainsi de suite... Par défaut :
Off.  |
x
| Â |
Augmente la lisibilité du motif en vous permettant des espaces et des
commentaires (voir l'explication plus bas). Par défaut :
Off. |
r
| Â |
Modificateur non standard. Si ajusté, les plages additionnelles de à -ÿ
incluent les lettres russe '¸', À-ß incluent en plus '¨', et à -ß inclus tous les
symboles russes. Par défaut : Off.    |
Remarque
concernant le
modificateur x : ce modificateur demande au moteur d'expressions régulières d'ignorer les espaces qui ne sont pas précédés d'un spécificateur d'échappement
ou qui ne sont pas dans une classe. Vous pouvez utiliser ceci pour dissocier
l'expression régulière en morceaux plus petit et plus lisibles. Le caractère #
est aussi traité comme un méta-caractère qui introduit les commentaires. Ceci
signifie que si vous voulez insérer des espace ou des caractères # dans le motif
(à l'extérieur de la classe, où ils ne sont pas affectés par le
modificateur
x), vous devrez insérer des spécificateurs d'échappements ou les encoder
avec des valeurs octales ou hexadécimales.
Pour utiliser un ou plusieurs
de ces
modificateurs, vous devez l'inclure dans l'expression régulière
elle-même en utilisant la construction
(?imsxr-imsxr). Si leur présence
est encapsulée dans une sous expression, alors seule la sous expression sera
affectée.
Exemples :
| Â Â (?i)Saint-Petersburg |
trouve 'Saint-petersburg' et 'Saint-Petersburg'.
 |
| Â Â (?i)Saint-(?-i)Petersburg |
trouve 'Saint-Petersburg' mais pas
'Saint-petersburg'.  |
| Â Â (?i)(Saint-)?Petersburg |
trouve 'Saint-petersburg' et
'saint-petersburg'.  |
| Â Â ((?i)Saint-)?Petersburg |
trouve 'saint-Petersburg', mais pas 'saint-petersburg' .
 |
6 - Commentaires
| Â (?#text) |
 met en
commentaire le texte "text". Â |
Cette construction
permet d'indiquer un commentaire, le texte est alors ignoré. Veuillez noter que le moteur d'expressions régulières ferme le commentaire aussitôt qu'il voit une parenthèse ")", ainsi il
n'y a aucune façon de placer une parenthèse dans le commentaire sans fermer
celui-ci.