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.

Syntaxe

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

Exemples

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@@, ... }

Informations complémentaires