Qu'est-ce qu'une expression régulière?
Les expressions régulières sont un langage de description de chaînes de caractères. Une expression régulière est un modèle, un patron, composé de caractères ASCII. Appliqué à un texte, ce modèle permet, par exemple, de trouver toutes les portions du texte qui lui correspondent.
Les expressions régulières sont utilisées dans de nombreux programmes UNIX (grep, emacs, vi, etc.). Ce langage est aussi souvent utilisé dans les menus "find/replace" des éditeurs de texte (textPad, BBedit, etc.), et bien sur dans la plupart des langages de programmation.
Modèles à un seul caractère
Tout caractère ASCII vaut pour lui-même. Le meta-caractères '.'
peut être utilisé à la place de n'importe quel caractère excepté du caractère retour-chariot. Si l'on veut rechercher le caratère '.'
lui même il faut placer un antislash avant pour dire qu'il s'agit du caractère et non du meta-caractère.
"a": chaîne "a"
"b": chaîne "b"
".": chaîne "a" ou "b" ou "c" ou ".", etc.
"\.": chaîne "."
Définition d'ensembles:
La définition d'un ensemble de caractères autorisés se fait avec l'aide des crochets [ ]
. L'expression de séries de caractère (comme de 'a' à 'z'
), peuvent être abrégées en désignant les deux caractères extrêmes séparés par un tiret ([a-z]
). L'ordre est alors celui du code ASCII. Le caractère '^'
après le premier crochet indique qu'il s'agit de l'ensemble complémentaire.
"[abc]": chaîne "a", "b" ou "c".
"[a-z]": chaîne qui contient un seul caractère compris entre "a" et "z"
"[^a-z]": n'importe quel caractère qui n'est pas compris entre "a" et "z"
Les symboles de répétition
Les symboles '*'
, '+'
et '?'
sont des codes répétition du caractère précédent. Il signifient respectivement "zero ou plusieurs", "une ou plusieurs", "une ou aucune" répétitions du caractère précédent.
"abc+": chaîne "ab" suivie de un ou plusieurs "c" ("abc", "abcc" etc..)
"abc*": chaîne "ab" suivie de zero ou plusieurs "c" ("ab", "abc" etc..)
"abc?": chaîne "ab" suivie de zero ou un "c" ("ab" ou "abc")
"ab.+": chaîne "ab" suivie de un ou plusieurs caractères identiques ("abc", "abcc", "abddd" etc..)
Les accolades {x,y}
permettent de fixer les limites du nombre de répétition.
"abc{2}": chaine "ab" suivie de exactement deux "c" ("abcc")
"abc{2,}": chaîne "ab" suivie de au moins deux "c" ("abcc" etc..)
"abc{2,4}": chaîne "ab" suivie 2, 3 ou 4 "c" ("abcc" .. "abcccc")
Attention: le premier nombre de la limite est obligatoire ("{0,2}", et non "{,2}").
On observe les équivalences:
"a*" <=> "a{0,}"
"a+" <=> "a{1,}",
"a?" <=> "a{0,1}".
"a" <=> "a{1}"
Modèles à séquence de caractères
Toute suite de caractères vaut pour elle-même.
"abc": chaîne "abc"
"cba": chaîne "cba"
"a.c": chaîne "abc" ou "acc" ou "a.c", etc.
Les symboles de positionnement
Les symboles '^'
et '$'
indiquent le début ou la fin d'une chaine, et permettent donc de la délimiter.
"^debut": ligne qui commence par "debut"
"fin$": ligne qui se termine par "fin"
"^chaine$": ligne qui commence et se termine par "chaine"
L'alternative
La barre verticale '|'
se comporte en tant qu'opérateur OU
"chien|chat": chaîne "chien" ou "chat"
"a|b|c": <=> "[abc]"
Les modèles avec mémoire
Les parenthèses ( ) permettent de stocker en mémoire des parties du modèle que l'on pourra réutiliser ailleurs dans le même modèle. Chaque valeur prise par le contenu de la parenthèse peut être appellé dans le modèle par \n avec n pouvant prendre des valeurs de 1 à 9 (1 pour la première paire de parenthèse rencontrée, 2 pour la deuxième, etc.)
"[aei]X[aei]": chaîne "aXa", "aXe", "aXa", "eXa", etc.
"([aei])X\1": chaîne "aXa", "eXe" ou "iXi".
Les parenthèses permettent aussi de regrouper des séquences sur lesquelles on pourra appliquer des opérateurs de répétition ou des alternatives.
"un (chien|chat)": chaîne "un chien" ou "un chat"
"(a|b)*": suite de "a" ou de "b" ("a", "aa", "aaab", "abaab", etc)
"a(bc)*": chaine "a" suivie de zero "bc" ou plus ("a", "abc", "abcbc", etc.)
Les caractères spéciaux
Pour utiliser un méta caractère en temps que caractère, il suffit de le faire précéder d'un antislash '\'
"\\" <=> antislash
"\t" <=> tabulation
"[](){}-.*?|^$" voir utilisation plus haut
...