NOM¶
regex - Expressions rationnelles POSIX.2
DESCRIPTION¶
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.
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. 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 ».
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.65 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¶
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 à
<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> ».