regex






regex − Expressions rationnelles POSIX.2

Les expressions rationnelles (« ER »), définies par POSIX.2 existent sous deux
formes : les ER modernes (en gros celles de egrep ; que POSIX.2 appelle
expressions rationnelles « étendues »), et les ER obsolètes (en gros celles de
ed(1) ; les ER de base pour POSIX.2) (N.d.T. : le terme « officiel » pour la
traduction de « regular expression » est « expression rationnelle », et c’est
celui que j’emploierai. Toutefois, on utilise couramment le terme « expression
régulière », même s’il s’agit d’un léger abus de langage). Les ER obsolètes
existent surtout à titre de compatibilité avec d’anciens programmes ; on en
parlera à la fin. POSIX.2 laisse de côté certains aspects syntaxiques et
sémantiques des ER ; un signe « (!) » indique une interprétation qui peut ne pas
être totalement portable sur d’autres implémentations de POSIX.2.

     Une ER (moderne) est une(!) ou plusieurs branches non−vides(!), séparées
par « | ». Elle correspond à tout ce qui correspond à l’une des branches.

     Une branche est une(!) ou plusieurs pièces concaténées. Elle correspond à
ce qui correspond à la première pièce, suivi de ce qui correspond à la seconde,
et ainsi de suite.

     Une pièce est un atome suivi éventuellement d’un unique(!) « * », « + »,
« ? », ou d’un encadrement. Un atome suivi de « * » correspond à une séquence de
0 ou plusieurs correspondances pour l’atome. Un atome suivi d’un « + »
correspond à une séquence de 1 ou plusieurs correspondances pour l’atome. Un
atome suivi d’un « ? » correspond à une séquence de zéro ou une correspondance
pour l’atome.

     Un encadrement est un « { » suivi d’un entier décimal non−signé, suivis
éventuellement d’une virgule, suivis éventuellement d’un entier décimal
non−signé, toujours suivis d’un « } ». Les entiers doivent être entre 0 et
RE_DUP_MAX (255(!)) compris, et s’il y en a deux, le second ne doit pas être
plus petit que le premier. Un atome suivi d’un encadrement contenant un entier i
et pas de virgule correspond à une séquence de i correspondances pour l’atome
exactement. Un atome suivi d’un encadrement contenant un entier i et une virgule
correspond à une séquence d’au moins i correspondances pour l’atome. Un atome
suivi d’un encadrement contenant deux entiers i et j correspond à une séquence
de i à j (compris) correspondances pour l’atome.

     Un atome est une expression rationnelle encadrée par des parenthèses
(correspondant à ce qui correspond à l’expression rationnelle), un ensemble vide
« () » (correspondant à une chaîne nulle)(!), une expression entre crochets
(voir plus bas), un point « . » (correspondant à n’importe quel caractère), un
accent « ^ » (correspondant à une chaîne vide en début de ligne), « $ »
(correspondant à une chaîne vide en fin de ligne), un « \ » suivi d’un des
caractères « ^.[$()|*+?{\ » (correspondant au caractère littéral − sans
signification particulière), un « \ » suivi de n’importe quel autre caractère(!)
(correspondant au caractère pris sous forme littérale, comme si le « \ » était
absent(!)), ou un caractère simple sans signification particulière
(correspondant à ce caractère). Un « { » suivi d’un caractère autre qu’un
chiffre est considéré sous sa forme littérale, pas un encadrement(!). Il est
illégal de terminer une ER avec un « \ » seul.











                                       ‐2‐


     Une expression entre crochets est une liste de caractères encadrés par
« [] ». Elle correspond normalement à n’importe quel caractère de la liste. Si
la liste débute par « ^ », elle correspond à n’importe quel caractère sauf ceux
de la liste. Si deux caractères de la liste sont séparés par un « − », ils
représentent tout l’intervalle de caractères entre eux (compris). Par exemple
« [0−9] » en ASCII représente n’importe quel chiffre décimal. Il est illégal(!)
d’utiliser la même limite dans deux intervalles, comme « a−c−e ». Les
intervalles dépendent beaucoup de l’ordre de classement des caractères, et les
programmes portables doivent éviter de les utiliser.

     Pour insérer un « ] » littéral dans la liste, il faut le mettre en première
position (ou après un éventuel « ^ »). Pour inclure un « − » littéral, il faut
le placer en première, dernière position, ou en seconde borne d’un intervalle.
Pour utiliser un − en première borne d’intervalle, encadrez−le entre « [. » et
« .] » pour en faire un élément de classement (voir plus bas). À l’exception de
ces éléments, et de quelques combinaisons avec des crochets (voir plus bas),
tous les autres caractères spéciaux, y compris le « \ », perdent leurs
significations spéciales dans une expression entre crochets.

     Dans une expression entre crochets, un élément de classement (un seul
caractère, ou une séquence de caractères qui se comporte comme un seul, ou un
nom de séquence de classement) entre « [. » et « .] » correspond à la séquence
des caractères de cet élément de classement. Une séquence est un élément unique
de l’expression entre crochets. Ainsi, une expression entre crochets contenant
un élément de classement multicaractères peut correspondre à plus d’un
caractère. Par exemple, si la séquence inclut un élément de classement « ch »,
alors l’ER « [[.ch.]]*c » correspond aux cinq premiers caractères de « chchcc ».

     Dans une expression entre crochets, un élément de classement encadré par
« [= » et « =] » est une classe d’équivalence, correspondant à la séquence des
caractères de tous les éléments de classement équivalents à celui−ci, y compris
lui−même (s’il n’y a pas d’autres éléments équivalents, le fonctionnement est le
même que si l’encadrement était « [. » et « .] »). Par exemple, si o et ^ sont
membres d’une classe équivalence, alors « [[=o=]] », « [[=^=]] », et « [o^] »
sont tous synonymes. Une classe d’équivalence ne doit(!)  pas être une borne
d’intervalle.

     Dans une expression entre crochets, le nom d’une classe de caractères
encadré par « [: » et « :] » correspond à la liste de tous les caractères de la
classe. Les noms des classes standard sont :


     alnum   digit   punct
     alpha   graph   space
     blank   lower   upper
     cntrl   print   xdigit


     Cela correspond aux classes des caractères définies pour wctype(3). Une
localisation peut en fournir d’autres. Une classe de caractères ne doit pas être
utilisée comme borne d’intervalle.

     Dans le cas où une ER peut correspondre à plusieurs sous−chaînes d’une
chaîne donnée, elle correspond à celle qui commence le plus tôt dans la chaîne.









                                       ‐3‐


Si l’ER peut correspondre à plusieurs sous−chaînes débutant au même point, elle
correspond à la plus longue sous−chaîne. Les sous−expressions correspondent
aussi à la plus longue sous−chaîne possible, à condition que la correspondance
complète soit la plus longue possible, les sous−expressions débutant le plus tôt
dans l’ER ayant priorité sur celles débutant plus loin. Notez que les
sous−expressions de haut niveau ont donc priorité sur les sous−expressions de
bas niveau les composant.

     La longueur des correspondances est mesurée en caractères, pas en éléments
de classement. Une chaîne vide est considérée comme plus longue qu’aucune
correspondance. Par exemple « bb* » correspond aux trois caractères du milieu de
« abbbc », « (wee|week)(knights|nights) » correspond aux dix caractères de
« weeknights », quand « (.*).* » est mis en correspondance avec « abc », la
sous−expression entre parenthèses correspond aux trois caractères, et si
« (a*)* » est mis en correspondance avec « bc » l’ER entière et la sous−ER entre
parenthèses correspondent toutes deux avec une chaîne nulle.

     Si une correspondance sans distinction de casse est demandée, toutes les
différences entre majuscules et minuscules disparaissent de l’alphabet. Un
symbole alphabétique apparaissant hors d’une expression entre crochets est
remplacé par une expression contenant les deux casses (par exemple « x » devient
« [xX] »). Lorsqu’il apparaît dans une expression entre crochets, tous ses
équivalents sont ajoutés (« [x] » devient « [xX] » et « [^x] » devient
« [^xX] »).

     Aucune limite particulière n’est imposée sur la longueur est ER(!). Les
programmes destinés à être portables devrait limiter leurs ER à 256 octets, car
une implémentation compatible POSIX peut refuser les expressions plus longues.

     Les expressions rationnelles obsolètes (de base) diffèrent sur plusieurs
points. « | », « + », et « ? » sont des caractères normaux sans équivalents. Les
délimiteurs d’encadrements sont « \{ » et « \} », car « { » et « { » sont des
caractères ordinaires. Les parenthèses pour les sous−expressions sont « \( » et
« \) », car « ( » et « ) » sont des caractères ordinaires. « ^ » est un
caractère ordinaire sauf au début d’une ER ou au(!) début d’une sous−expression
entre parenthèses, « $ » est un caractère ordinaire sauf à la fin d’une ER ou
à(!) la fin d’une sous−expressions entre parenthèses, et « * » est un caractère
ordinaire s’il apparaît au début d’une ER ou au début d’une sous−expression
entre parenthèses (après un éventuel « ^ »).

     Enfin, il existe un nouveau type d’atome, la référence arrière : « \ »
suivi d’un chiffre décimal non−nul n correspond à la même séquence de caractères
que ceux mis en correspondance avec la n−ième sous−expression entre parenthèses
(les sous−expressions sont numérotées par leurs parenthèses ouvrantes, de gauche
à droite), ainsi « \([bc]\)\1 » correspond à « bb » ou « cc » mais pas à « bc ».

Avoir deux sortes d’ER est un calvaire.

     La norme POSIX.2 actuelle dit que « ) » est un caractère ordinaire en
l’absence de la « ( » correspondante. C’est dû à une erreur d’interprétation et
changera probablement. Évitez d’en tenir compte.

     Les références arrières sont un vrai calvaire, et posent de gros problèmes
d’efficacité pour l’implémentation. Elles sont de plus assez mal définies









                                       ‐4‐


(est−ce que « a\(\(b\)*\2\)*d » correspond à « abbbd » ?). Évitez−les.

     Les spécifications POSIX.2 sur les correspondances sans distinction de
casse sont assez vagues. La description donnée plus haut est le consensus actuel
parmi les implémenteurs.

Cette page a été prise dans le paquet regex de Henry Spencer.

grep(1), regex(3)

     POSIX.2, section 2.8 (Regular Expression Notation).

Cette page fait partie de la publication 3.70 du projet man−pages Linux. Une
description du projet et des instructions pour signaler des anomalies peuvent
être trouvées à l’adresse http://www.kernel.org/doc/man−pages/.

Depuis 2010, cette traduction est maintenue à l’aide de l’outil po4a
<http://po4a.alioth.debian.org/> par l’équipe de traduction francophone au sein
du projet perkamon <http://perkamon.alioth.debian.org/>.

     Christophe Blaess <http://www.blaess.fr/christophe/> (1996‐2003), Alain
Portal <http://manpagesfr.free.fr/> (2003‐2006).  Julien Cristau et l’équipe
francophone de traduction de Debian (2006‐2009).

     Veuillez signaler toute erreur de traduction en écrivant à
<perkamon−fr@traduc.org>.

     Vous pouvez toujours avoir accès à la version anglaise de ce document en
utilisant la commande « LC_ALL=C man <section> <page_de_man> ».