Provided by: manpages-fr_1.67.0-1_all bug

NOM

       regex - Expressions rationnelles POSIX 1003.2.

DESCRIPTION

       Les  expressions  rationnelles  (‘‘ER’’),  définies  par  Posix 1003.2
       existent sous deux formes : les ER modernes (en gros celles de egrep  ;
       que  Posix  1OO3.2 appelle expressions rationnelles "étendues"), et les
       ER obsolètes (en gros celles de ed(1) ;  les  ER  basiques  pour  Posix
       1003.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 plus bas.  Posix 1003.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émentation de 1003.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 à ue 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),  An  atom  is  a  regular  expression
       enclosed  in  ‘()’  (matching  a  match for the regular expression), 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  inclue  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  ny a pas d’autre é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 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é comme borne d’intervalle.

       Il  existe  deux  cas  spéciaux(!)  d’expressions  entre crochets : les
       expressions ‘[[:<:]]’ et ‘[[:>:]]’ correspondent à une chaîne  vide  en
       début  et  en  fin  de mot, respectivement. Un mot est défini comme une
       séquence de  caractères  de  mot,  qui  n’est  suivie  ni  précédée  de
       caractères  de  mot.  Un caractère de mot est un caractère alnum (comme
       défini par wctype(3)) ou un souligné.  C’est une extension,  compatible
       mais  non  spécifiée  par  POSIX  1003.2,  et  doit  être utilisée avec
       précaution dans les logiciels destinés  à  être  portés  vers  d’autres
       systèmes.

       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  apparait  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’.

VOIR AUSSI

       regex(3)

       POSIX 1003.2, section 2.8 (Regular Expression Notation).

BOGUES

       Avoir deux sortes d’ER est un calvaire.

       Les  spécifications 1003.2 disent que ‘)’ est un caractère ordinaire en
       l’absence  de  la  ‘(’  correspondante.   C’est   dû   à   une   erreur
       d’interprétation et changera probablement.  Evitez 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’ ?).
       Evitez-les.

       Les spécifications 1003.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.

       La syntaxe concernant les limites de mot est incroyablement laide.

AUTEUR

       Cette page provient du paquet regex de Henry Spencer.

TRADUCTION

       Christophe Blaess, 2003.