Une expression rationnelle est une notation permettant de décrire un ensemble de suite de symboles. En pratique, elle permet de représenter de manière très compacte un ensemble de chaînes de caractères.
Sous Unix, de nombreux utilitaires tels que le shell bash, grep ou bien emacs manipulent des expressions rationnelles. Elles servent principalement (mais pas uniquement) à effectuer des recherches dans un texte. Ainsi, un utilisateur peut représenter de manière compacte un ensemble de chaînes de caractères sous la forme d'une expression rationnelle et un outil adéquat (tel que grep) peut rechercher dans un texte toutes les chaînes de caractères qui se trouvent dans l'ensemble décrit par l'expression rationnelle.
Dans le contexte de la recherche dans un texte, on désigne souvent l'expression rationnelle comme étant un motif ou un pattern et l'on désire trouver dans un texte toutes les séquences qui correspondent au motif donné.
Au final, les expressions rationnelles sont très flexibles et peuvent représenter des ensembles de chaînes de caractères allant de "l'ensemble contenant uniquement la lettre a
" jusqu'à "l'ensemble contenant toutes les chaînes de caractères commençant par la suite de lettres abc
suivie d'un nombre arbitraire d'espaces suivi de soit la suite xyz
soit une répétition entre 4 et 42 fois de la suite nve
".
Le terme anglais est regular expression, souvent abrégé en RegExp ou Regex. La traduction française est expression rationnelle (abrégé en ER) mais l'on rencontre souvent la traduction erronée expression régulière.
Une expression rationnelle est composée de caractères et de méta-caractères.
Les caractères se représentent eux-même. Ils conservent leur signification littérale. Ce sont les symboles (les caractères) que l'on va retrouver dans l'ensemble de chaînes décrit par l'expression rationnelle. Ainsi, l'expression rationnelle formée par les caractères abc
représente l'ensemble de chaînes de caractères contenant l'unique chaîne abc
.
Les méta-caractères changent l'interprétation des caractères et modifient donc l'ensemble des chaînes de caractères représenté par l'expression rationnelle. Par exemple, le méta-caractère *
placé après un caractère signifie "toute répétition (y compris zéro) de ce caractère". Ainsi, l'expression rationnelle abc*
représente l'ensemble des chaînes de caractères commençant par ab
suivi d'un nombre quelconque de c
: {ab
, abc
, abcc
, abccc
, abcccc
, abccccc
, abcccccc
, ... }
La syntaxe des expressions rationnelles est loin d'être standardisée. Certains méta-caractères de base sont standards, mais chaque outil propose diverses extensions. Voici cependant une liste des méta-caractères les plus courants :
.
signifie n'importe quel caractère
*
placé après un caractère signifie toute répétition (y compris zéro) de ce caractère
[]
signifie une occurrence d'un des caractères placés entre crochets ou d'un des caractères contenu dans la plage de caractères placée entre crochets
[^]
est le complément de []
, c'est-à-dire une occurrence d'un caractère qui n'est pas un de ceux placés entre crochets ou pas un de ceux faisant partie de la plage de caractères placés entre crochets
La plupart des outils de recherche de texte manipulant des expressions rationnelles proposent aussi des méta-caractère permettant de situer l'emplacement du texte à rechercher par rapport au début ou à la fin de la ligne.
^
signifie le début de la ligne
$
signifie la fin de la ligne
Voici une liste d'exemple d'expressions rationnelles accompagnées de l'explication de l'ensemble qu'elles représentent.
abc
représente l'ensemble contenant la chaîne de caractères abc
: { abc
}
x.z
représente l'ensemble des chaînes de trois lettres dont la première est x
, la troisième est z
et la deuxième est n'importe quelle lettre mais n'est pas un symbole vide : { xaz
, xbz
, ..., xxz
, xyz
, xzz
, ..., x#z
, ... }
xy*z
représente l'ensemble des chaînes commençant par x
, se terminant par z
avec un nombre arbitraire de y
entre ces deux caractères : { xz
, xyz
, xyyz
, xyyyz
, ..., xyyyyyyyyyyyyyyyyyyyyyyyyyyyyz
, ... }
[tdr]ugudu
représente l'ensemble des chaînes commençant par soit t
, d
ou r
et se terminant par ugudu
: { tugudu
, dugudu
, rugudu
}
ta[g-k]ada
représente l'ensemble des chaînes commençant par ta
, se terminant par ada
avec entre ces deux termes n'importe quel caractère allant de g
à k
: { tagada
, tahada
, taiada
, takada
}
[^p]luie
représente l'ensemble des chaînes commençant par un caractère autre que p
et se terminant par luie@ : {
aluie,
bluie,
cluie, ...,
oluie,
qluie,
rluie@@, ... }