NOM
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 basiques pour POSIX.2).
[NDT : 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 pices 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 « () » (correspond à 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.
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 lintervalle 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 une
fusion (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 crochet, une fusion (un seul caractère, ou
une séquence de caractères qui se comporte comme un seul, ou un nom de
fusion) entre « [. » et « .] » correspond à la séquence des caractères
de la fusion. Une séquence est un élément unique de l’expression entre
crochets. Ainsi, un expression entre crochets contenant une fusion
multi-caractères peut correspondre à plus d’un caractère. Par exemple,
si la séquence inclut la fusion « ch », alors l’ER « [[.ch.]]*c »
correspond aux cinq premiers caractères de « chchcc ».
Dans une expression entre crochets, une séquence encadrée par « [= » et
« =] » est une classe d’équivalence, correspondant à la séquence des
caractères de tous les éléments é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=]] », « [[=o^=]] », et « [oo^] » sont tous synonymes. Une
classe d’équivalence ne doit(!) pas être une borne d’intervalle.
Dans une expression entre crochet, le nom d’une classe de caractres
encadré par « [: » et « :] » correspond à la liste de tous les
caractères de la classe. Les noms des classes standards sont :
alnum digit punct
alpha graph space
blank lower upper
cntrl print xdigit
Cela correspond aux classes des caractères définis 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. 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 fusionnés. Une chaîne vide est considérée comme plus longueur
qu’aucune correspondance. Par exemple « bb* » correspond au 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 (basiques) 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 rfrence arrire : « \»
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 ».
BOGUES
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 (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.
AUTEUR
Cette page a été prise dans le paquet regex de Henry Spencer.
VOIR AUSSI
grep(1), regex(3)
POSIX.2, section 2.8 (Regular Expression Notation).
COLOPHON
Cette page fait partie de la publication 3.23 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/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».
12 janvier 2009