regex(7) Miscellaneous Information Manual regex(7)
NOM
regex - Expressions rationnelles POSIX.2
DESCRIPTION
Les expressions rationnelles (<< ER >>), definies par POSIX.2 existent
sous deux formes : les ER modernes (en gros, celles de egrep(1) que
POSIX.2 appelle expressions rationnelles << etendues >>) et les ER
obsoletes (en gros, celles de ed(1) -- les ER << basiques >> pour
POSIX.2) (N.d.T. : le terme << officiel >> pour la traduction de
<< regular expression >> est << expression rationnelle >> et c'est
celui employe ici, mais consultez
https://fr.wikipedia.org/wiki/Expression_regulieres). Les ER obsoletes
existent surtout a titre de compatibilite avec d'anciens programmes et
elles seront abordees a la fin. POSIX.2 laisse de cote certains aspects
syntaxiques et semantiques des ER ; un signe << (!) >> indique une
interpretation qui peut ne pas etre totalement portable sur d'autres
implementations de POSIX.2.
Une ER (moderne) est une(!) ou plusieurs branches non vides(!),
separees par << | >>. Elle correspond a tout ce qui correspond a l'une
des branches.
Une branche est une(!) ou plusieurs pieces concatenees. Elle correspond
a ce qui correspond a la premiere piece, suivi de ce qui correspond a
la seconde, et ainsi de suite.
Une piece est un atome suivi eventuellement d'un unique(!) << * >>,
<< + >>, << ? >> ou d'un encadrement. Un atome suivi de << * >>
correspond a une sequence de zero ou plusieurs correspondances pour
l'atome. Un atome suivi d'un << + >> correspond a une sequence d'une ou
plusieurs correspondances pour l'atome. Un atome suivi d'un << ? >>
correspond a une sequence de zero ou une correspondance pour l'atome.
Un encadrement est un << { >> suivi d'un entier decimal non signe,
suivi eventuellement d'une virgule, suivie eventuellement d'un autre
entier decimal non signe, toujours suivis d'un << } >>. Les entiers
doivent etre entre 0 et RE_DUP_MAX (255(!)) compris et, s'il y en a
deux, le second ne doit pas etre plus petit que le premier. Un atome
suivi d'un encadrement contenant un entier i et pas de virgule
correspond a une sequence de i correspondances pour l'atome exactement.
Un atome suivi d'un encadrement contenant un entier i et une virgule
correspond a une sequence d'au moins i correspondances pour l'atome. Un
atome suivi d'un encadrement contenant deux entiers i et j correspond a
une sequence de i a j (compris) correspondances pour l'atome.
Un atome est une ER encadree par des parentheses (correspondant a ce
qui correspond a l'ER), un ensemble vide << () >> (correspondant a la
chaine vide)(!), une expression entre crochets (voir plus bas), un
point << . >> (correspondant a n'importe quel caractere), un accent
<< ^ >> (correspondant a une chaine vide en debut de ligne), << $ >>
(correspondant a une chaine vide en fin de ligne), un << \ >> suivi
d'un des caracteres << ^.[$()|*+?{\ >> (correspondant a ce caractere
considere comme un caractere ordinaire), un << \ >> suivi de n'importe
quel autre caractere(!) (correspondant au caractere pris sous forme
litterale, comme si le << \ >> etait absent(!)), ou un caractere simple
sans signification particuliere (correspondant a ce caractere). Un
<< { >> suivi d'un caractere autre qu'un chiffre est considere sous sa
forme litterale et non pas comme le debut d'un encadrement(!). Il est
illegal de terminer une ER avec un << \ >>.
Une expression entre crochets est une liste de caracteres encadres par
<< [] >>. Elle correspond normalement a n'importe quel caractere de la
liste (mais voir ci-apres). Si la liste debute par << ^ >>, elle
correspond a n'importe quel caractere sauf ceux de la liste (mais voir
ci-apres). Si deux caracteres de la liste sont separes par un << - >>,
ils representent tout l'intervalle de caracteres entre eux (compris).
Par exemple << [0-9] >> en ASCII represente n'importe quel chiffre
decimal. Il est illegal(!) d'utiliser la meme limite dans deux
intervalles, comme << a-c-e >>. Les intervalles dependent beaucoup de
l'ordre de classement des caracteres et les programmes portables
doivent eviter de les utiliser.
Pour inserer un << ] >> litteral dans la liste, il faut le mettre en
premiere position (ou apres un eventuel << ^ >>). Pour inclure un
<< - >> litteral, il faut le placer en premiere ou en derniere
position, ou comme seconde borne d'un intervalle. Pour utiliser un
<< - >> comme premiere borne d'intervalle, encadrez-le entre << [. >>
et << .] >> pour en faire un element de classement (voir plus bas). A
l'exception de ces elements et de quelques combinaisons avec des
crochets (voir plus bas), tous les autres caracteres speciaux, y
compris le << \ >>, perdent leurs significations speciales dans une
expression entre crochets.
Dans une expression entre crochets, un element de classement (un seul
caractere ou une sequence de caracteres qui se comporte comme un seul,
ou un nom de sequence de classement pour l'un ou l'autre) entre
<< [. >> et << .] >> correspond a la sequence des caracteres de cet
element de classement. Une sequence est un seul element de la liste
d'expressions entre crochets. Une expression entre crochets contenant
un element de classement multicaractere peut donc correspondre a plus
d'un caractere. Par exemple, si la sequence inclut un element de
classement << ch >>, alors l'ER << [[.ch.]]*c >> correspond aux cinq
premiers caracteres de << chchcc >>.
Dans une expression entre crochets, un element de classement encadre
par << [= >> et << =] >> est une classe d'equivalence, correspondant
aux sequences de caracteres de tous les elements de classement
equivalents a celui-ci, y compris lui-meme (s'il n'y a pas d'autres
elements equivalents, le fonctionnement est le meme que si
l'encadrement etait << [. >> et << .] >>). Par exemple, si o et o sont
membres d'une classe equivalence, alors << [[=o=]] >>, << [[=o=]] >>,
et << [oo] >> sont tous synonymes. Une classe d'equivalence ne doit(!)
pas etre une borne d'intervalle.
Dans une expression entre crochets, le nom d'une classe de caracteres
encadre par << [: >> et << :] >> correspond a la liste de tous les
caracteres de la classe. Les noms des classes standard sont :
alnum digit punct
alpha graph space
blank lower upper
cntrl print xdigit
Ces classes correspondent aux classes de caracteres definies pour
wctype(3). Une localisation peut en fournir d'autres. Une classe de
caracteres ne doit pas etre utilisee comme borne d'intervalle.
Dans le cas ou une ER peut correspondre a plusieurs sous-chaines d'une
chaine donnee, elle correspond a celle qui commence le plus tot dans la
chaine. Si l'ER peut correspondre a plusieurs sous-chaines debutant au
meme point, elle correspond a la plus longue sous-chaine. Les
sous-expressions correspondent aussi a la plus longue sous-chaine
possible, a condition que la correspondance complete soit la plus
longue possible, avec les sous-expressions debutant le plus tot dans
l'ER ayant priorite sur celles debutant plus loin. Notez que les
sous-expressions de haut niveau ont donc priorite sur les
sous-expressions de bas niveau les composant.
La longueur des correspondances est mesuree en caracteres, pas en
elements de classement. Une chaine vide est consideree comme plus
longue qu'aucune correspondance. Par exemple << bb* >> correspond aux
trois caracteres du milieu de << abbbc >>,
<< (wee|week)(knights|nights) >> correspond aux dix caracteres de
<< weeknights >>, quand << (.*).* >> est mis en correspondance avec
<< abc >>, la sous-expression entre parentheses correspond aux trois
caracteres, et si << (a*)* >> est mis en correspondance avec << bc >>,
l'ER entiere et la sous-ER entre parentheses correspondent toutes deux
avec la chaine vide.
Si une correspondance sans distinction de casse est demandee, toutes
les differences entre capitales et minuscules disparaissent de
l'alphabet. Quand un symbole alphabetique existant dans les deux casses
apparait hors d'une expression entre crochets, il est remplace par une
expression contenant les deux casses (par exemple << x >> devient
<< [xX] >>). Lorsqu'il apparait dans une expression entre crochets,
tous ses equivalents sont ajoutes (<< [x] >> devient << [xX] >> et
<< [^x] >> devient << [^xX] >>).
Aucune limite particuliere n'est imposee sur la longueur des ER(!). Les
programmes destines a etre portables devraient limiter leurs ER a
256 octets, car une implementation peut refuser les expressions plus
longues pour demeurer compatible avec POSIX.
Les expressions rationnelles obsoletes (<< basiques >>) different sur
plusieurs points. << | >>, << + >> et << ? >> sont des caracteres
normaux et n'ont pas d'equivalents pour leurs fonctionnalites. Les
delimiteurs d'encadrement sont << \{ >> et << \} >>, car << { >> et
<< } >> sont des caracteres ordinaires. Les parentheses pour les
sous-expressions sont << \( >> et << \) >>, << ( >> et << ) >> etant
par eux-memes des caracteres ordinaires. << ^ >> est un caractere
ordinaire sauf au debut d'une ER ou(!) au debut d'une sous-expression
entre parentheses, << $ >> est un caractere ordinaire sauf a la fin
d'une ER ou(!) a la fin d'une sous-expression entre parentheses, et
<< * >> est un caractere ordinaire s'il apparait au debut d'une ER ou
au debut d'une sous-expression entre parentheses (apres un eventuel
<< ^ >> au debut).
Enfin, il existe un nouveau type d'atome, la reference arriere :
<< \ >> suivi d'un chiffre decimal non nul n qui correspond a la meme
sequence de caracteres que ceux mis en correspondance avec la n-ieme
sous-expression entre parentheses (les sous-expressions sont numerotees
par leurs parentheses ouvrantes, de gauche a droite), ainsi
<< \([bc]\)\1 >> correspond a << bb >> ou << cc >> mais pas a << bc >>.
BOGUES
Utiliser deux sortes d'ER est une ineptie.
La norme POSIX.2 actuelle dit que << ) >> est un caractere ordinaire en
l'absence de la << ( >> correspondante. C'est du a une erreur
d'interpretation et cela changera probablement. Evitez d'en tenir
compte.
Les references arrieres sont une terrible ineptie et posent de gros
problemes pour une implementation efficace. Elles sont de plus assez
mal definies (est-ce que << a\(\(b\)*\2\)*d >> correspond a
<< abbbd >> ?). Evitez-les.
Les specifications de POSIX.2 sur les correspondances sans distinction
de casse sont assez vagues. La definition << une casse implique toutes
les casses >> donnee plus haut est le consensus actuel parmi les
implementations comme etant la bonne interpretation.
AUTEUR
Cette page est tiree du paquet regex de Henry Spencer.
VOIR AUSSI
grep(1), regex(3)
POSIX.2, section 2.8 (Regular Expression Notation).
TRADUCTION
La traduction francaise de cette page de manuel a ete creee par
Christophe Blaess , Stephan Rafin
, Thierry Vignaud ,
Francois Micaux, Alain Portal , Jean-Philippe
Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas
Huriaux , Nicolas Francois
, Florentin Duneau
, Simon Paillard , Denis Barbier , David Prevot
, Frederic Hantrais et Jean-
Paul Guillonneau
Cette traduction est une documentation libre ; veuillez vous reporter a
la GNU General Public License version 3
concernant les conditions
de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE.
Si vous decouvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message a .
Pages du manuel de Linux 6.06 1 novembre 2023 regex(7)