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)