Table des matières
re_syntax
Syntaxe des expressions rationnelles Tcl
Description
Une regular expression (expression rationnelle / RE) décrit des chaînes de caractères. C'est un modèle qui correspond à certaines chaînes et ne correspond pas à d'autres
Différentes sortes de RE
Les expressions rationnelles (“RE”s), comme défini par POSIX, existent de deux sortes: étendue REs (“EREs”) et basiques REs (“BREs”). Les EREs sont celles du egrep traditionnel, alors que BREs sont celles du ed traditionnel. Cette implémentation ajoute une troisième sorte, advanced REs (“AREs”), EREs avec quelques extensions significatives.
Cette page de manuel décrit d'abord les AREs. Les BREs existent principalement pour compatibilité ascendante avec quelques anciens programmes; elles seront vues à la fin. Les EREs POSIX sont presque un sous ensemble exact des AREs. Les fonctionnalités des AREs qui ne sont pas présentes dans les EREs seront indiquées
Syntaxe des expressions rationnelles
Les expressions Tcl rationnelles sont implémentées en utilisant le package écrit par Henry Spencer, basé sur les spécification 1003.2 et quelques unes (pas toutes) des extensions Perl5. La plus grande partie de la description des expressions rationnelles ci-dessous est copiée texto de sa page de manuel.
Une ARE est composée d'une ou plusieurs branches, séparées par |, égales à tout ce qui correspond à quelconque des branches.
Une branche est zéro ou plusieurs contraintes ou atomes quantifié, concaténés. C'est une correspondance au premier, suivi par une correspondance au second, etc; une branche vide correspond à la chaîne vide.
Un atome quantifié est un atome éventuellement suivi d'un quantificateur. Sans quantificateur, c'est une correspondance à l'atome. Les quantificateurs, et leur atome correspondant, sont:
- * une séquence de 0 ou plus correspondances à l'atome
- + une séquence de 1 ou plus correspondances à l'atome
- ? une séquence de 0 ou 1 correspondance à l'atome
- {m} une séquence de exactement m correspondances à l'atome
- {m,} une séquence de m ou plus correspondances à l'atome
- {m,n} une séquence de m à n (incluses) correspondances à l'atome; m inférieur à n
- *?+? ?? {m}? {m,}? {m,n}? quantificateurs non-greedy, qui correspondent au même possibilités, mais se réfèrent au plus petit nombre plutôt qu'au plus grand nombre de correspondances (voir correspondances)
Les formes utilisant { et } sont appelées limites. Les nombres m et n sont des entiers décimaux non signés avec des valeurs autorisées de 0 à 255 inclus.
Un atome est l'un de:
- (re) (où re est toute expression rationnelle) correspond une correspondance à re, avec la correspondance marquée pour rapport
- (?:re) comme précédent, mais sans reporting (une “non-capturing” ensemble de parenthèses)
- () correspond à une chaîne vide, marquée pour rapport.
- (?:) correspond à une chaîne vide, sans rapport
- [chars] une bracket expression, correspondante à un quelconque chars (voir bracket expressions pour plus de détail)
- . correspond à un seul caractère quelconque
- \k (où k est un caractère non-alphanumérique) correspond au caractère interprété comme un caractère ordinaire, e.x
correspond un caractère antislash - \c où c est alphanumérique (éventuellement suivi par autre caractères), un escape (AREs seulement), voir escapes ci-dessous
- { quand suivi par un caractère autre qu'un chiffre, correspond à l'accolade ouvrante {; quand suivi par un chiffre, c'est le début d'un intervalle (voir plus haut)
- X où x est un simple caractère sans autre signification, correspond à ce caractère.
Une contrainte correspond à une chaîne vide quand des conditions spécifique sont rencontrées. Une contrainte ne peut pas être suivie par un quantificateur. Les contraintes simples sont comme suit; quelques autres sont décrite plus tard, sous echappements.
- ^ correspond au début d'une ligne
- $ correspond à la fin d'une ligne
- (?=re) positive lookahead (AREs seulement), correspond au point quelconque où une sous chaîne correspondante à re commence
- (?!re) negative lookahead (AREs seulement), correspond au point quelconque où aucune sous chaîne correspondante à re ne commence
Les contraintes lookahead ne peuvent pas contenir de références arrières (voir plus loin), et toutes parenthèses à l'intérieur sont considérées non-capturantes.
Une RE ne peut pas finir avec \
Bracket expressions
Expressions crochets
Une expression crochets est une liste de caractères entourée de []. Elle correspond normalement à tout caractère de la liste (mais voir ci-dessous). Si la liste commence avec ^, elle correspond à tout caractère (mais voir ci-dessous) non inclus dans la liste.
Si deux caractères de la liste sont séparés par -, c'est un raccourci pour l'intervalle complet des caractères entre les deux (inclus) dans la séquence ordonnée, ex. [0-9] en ASCII correspond à tout chiffre décimal. Deux intervalles ne peuvent pas partager une limite, donc par ex. a-c-e est illégal. Les intervalles sont très dépendant de l'ordre de tri, et les programmes portables ne peuvent s'appuyer dessus.
Pour inclure un ] ou - littéral dans la liste, la méthode la plus simple est de l'entourer de [. et .] pour en faire un élément d'assemblage (voir ci-dessous). Alternativement, placez le en premier (suivant un ^ éventuel), ou (AREs seulement) faites le précéder de \. Alternativement, pour -, faites en le dernier caractère, ou le second point d'un intervalle. Pour utiliser un - littéral comme le premier point d'un intervalle, faites en un élément d'assemblage ou (AREs seulement) faites le précéder de \. A l'exception de ceux-ci, de toutes combinaisons utilisant [ (voir paragraphes suivant), et les échappements, tout autres des caractères spéciaux perdent leur signification spéciale à l'intérieur d'une expression crochet.
Dans une expression crochet, un élément d'assemblage (un caractère, une séquence multi-caractère qui est assemblée comme si c’était un simple caractère, ou un nom de séquence d'assemblage pour les deux) entouré de [. et .] équivaut à la séquence de caractères de cet élément d'assemblage. La séquence est un seul élément de liste de l'expression crochet. Une expression crochet dans une locale qui a des éléments d'assemblages multi-caractère peut donc correspondre à plus d'un caractère. Ainsi (insidieusement), une expression crochet qui commence avec ^ peut correspond à des élément d'assemblages multi-caractère même si aucun d'eux n’apparaît dans l'expression crochet! (Note: Tcl n'a pas d'élément d'assemblages multi-caractère. Cette information est seulement présente pour illustration.)
Par exemple, supposez une séquence d'assemblage incluant un élément d'assemblage ch multi-caractère. Ensuite la RE .ch.*c (zéro ou plus ch's suivi par c) correspond les cinq premiers caractères de chchcc. Également, la RE [^c]b correspond à tout de chb (parce que [^c] correspond au multi-caractère ch).
Dans une expression crochet, un élément d'assemblage entouré de [= et =] est une classe d'équivalence, remplaçant la séquence de caractères de tout élément d'assemblage équivalent à celui-ci, incluant lui-même. (Si il n'y a pas d'autre élément d'assemblage équivalent, le traitement est le même que si les délimiteurs étaient [. et .].) Par exemple, si o et ô sont les membres d'une classe d'équivalence, alors [[=o=]], [[=ô=]], et [oô] sont tous synonymes. Une classe d'équivalence ne peut pas être le point final d'un intervalle. (Note: Tcl implémente seulement la locale Unicode. Il ne définit aucune classes d'équivalence. Les exemples précédents sont juste des illustrations.)
Dans une expression crochet, le nom d'une character class entourée de [: et :] équivaut à la liste de tous les caractères (pas tous les éléments d'assemblage!) appartenant à cette classe. Les classes standard de caractères sont:
- alpha Une lettre
- upper Une lettre majuscule
- lower Une lettre minuscule
- digit Un chiffre décimal
- xdigit Un chiffre hexadécimal
- alnum Un caractère alphanumérique (lettre ou chiffre)
- print Un caractère alphanumérique (même que alnum)
- blank Un espace ou tabulation
- space Un caractère produisant un espace dans du texte affiché
- punct Un caractère de ponctuation
- graph Un caractère avec une représentation visible
- cntrl Un caractère de contrôle.
Une locale peut en fournir d'autres. (Notez que l'implémentation Tcl courante a seulement une locale: la locale Unicode.) Une classe de caractère ne peut pas être utilisée comme point final d'un intervalle.
Il y a deux cas spéciaux d'expressions crochet: les expressions crochet [[:<:]] et [[:>:]] sont des contraintes, correspondant à des chaîne vides respectivement au début et à la fin d'un mot. Un mot est défini comme une séquence de mots caractères qui est ni précédée ni suivie par des mots caractères. Un mot caractère est un caractère alnum ou un underscore (_). Ces expressions crochet spéciales sont obsolètes; les utilisateurs d'AREs devraient utiliser les contraintes échappement à la place (voir ci-dessous).
Echappements
Les échappements (AREs seulement), qui commencent avec un \ suivi d'un caractère alphanumérique, existent de plusieurs sortes: entrée caractère, classe, constraint escapes, et back références. Un \ suivi par un caractère alphanumérique mais ne constituant pas un échappement valide est illégal dans une ARE. Dans les EREs, il n'y a pas d’échappements : en dehors d'une expression crochet, un \ suivi par un caractère alphanumérique équivaut simplement à ce caractère comme un caractère ordinaire, et dans une expression crochet, \ est un caractère ordinaire. (Le dernier est une incompatibilité entre les EREs et les AREs.)
Les échappements entrée caractère (AREs seulement) existent pour faciliter la spécification de caractères non imprimables et autrement inutilisables dans REs:
- \a caractère bip (bell), comme en C
- \b backspace, comme en C
- \B synonyme pour \ réduire la répétition des backslash dans quelques applications ou il y a des niveaux multiples de traitement des backslash
- \cX (où X est un caractère quelconque) le caractère dont les 5 bits de poids faible sont les même que ceux de X, et dont les autres bits sont tous à zéro
- \e caractère dont le nom de séquence d'assemblage est ESC, ou le caractère avec une valeur octale de 033
- \f formfeed, comme en C
- \n newline, comme en C
- \r retour chariot, comme en C
- \t tabulation horizontale, comme en C
- \uwxyz (où wxyz est exactement quatre chiffres hexadécimaux) le caractère Unicode U+wxyz dans l' ordre d'octet local
- \Ustuvwxyz (où stuvwxyz est exactement huit chiffres hexadécimaux) réservé pour une extension Unicode hypothétique à 32 bits
- \v tabulation verticale, comme en C.
- \xhhh (où hhh est une séquence quelconque de chiffres hexadécimaux) le caractère dont la valeur hexadécimale est 0xhhh (un simple caractère sans tenir compte de combien de chiffres hexadécimaux sont utilisés).
- \0 le caractère dont la valeur est 0
- \xy (où xy est exactement deux chiffres octal, et n'est pas une back reference (voir ci-dessous)) le caractère dont la valeur octale est 0xy
- \xyz (où xyz est exactement trois chiffres octaux, et n'est pas une back référence (voir ci-dessous)) le caractère dont la valeur octale est 0xyz
Les chiffres Hexadécimaux sont 0-9, a-f, et A-F. Les chiffres Octaux sont 0-7.
Les échappements caractère-entrée sont toujours interprétés comme des caractères ordinaires. Par exemple, \135 est ] en ASCII, mais \135 ne peut terminer une expression crochet. Attention, néanmoins, que quelque application (ex.,un compilateur C) n'interprète ces séquences elle-même avant le package regular-expression, qui peut exiger le doublage (quadruple, etc.) du \.
Les échappements Class-shorthand (AREs seulement) fournissent des raccourcis pour certaines classes de caractère communément utilisées:
- \d [[:digit:]]
- \s [[:space:]]
- \w [[:alnum:]_] (notez l'underscore)
- \D [^[:digit:]]
- \S [^[:space:]]
- \W [^[:alnum:]_] (notez l'underscore)
Dans les expressions crochets, \d, \s, et \w perdent leurs crochets externes, et \D, \S, et \W sont illégaux. (Ainsi, par exemple, [a-c\d] est équivalent à [a-c[:digit:]]. Egalement, [a-c\D], qui est équivalent à [a-c^[:digit:]], est illégal.)
Un constraint escape (AREs seulement) est une contrainte, correspondant à la chaîne vide si des conditions spécifiques sont rencontrées, écrite comme un échappement :
- \A correspond seulement au début de la chaîne (voir CORRESPONDANCES, ci-dessous, pour comment ceci diffère de ^)
- \m correspond seulement au début d'un mot
- \M correspond seulement à la fin d'un mot
- \y correspond seulement au début ou à la fin d'un mot
- \Y correspond seulement à un point qui n'est pas le début ou la fin d'un mot
- \Z correspond seulement à la fin de la chaîne (voir CORRESPONDANCES, ci-dessous, pour comment ceci diffère de $)
- \m (où m est un chiffre non nul) une back reference, voir ci-dessous
- \mnn (où m est un chiffre non nul, et nn sont d'autres chiffres, et la valeur décimale mnn n'est pas supérieure au nombre de parenthèses fermantes) une back reference, voir ci-dessous
Un mot est défini comme dans la spécification de \[\[:<:]] et \[\[:>:]] plus haut. Constraint escapes sont illégales dans les expressions crochets.
Une back référence (AREs seulement) correspond à la même chaîne que celle qui correspond aux sous expressions entre parenthèses spécifié par les nombres, ainsi ([bc])\1 correspond bb ou cc mais pas bc. La sous expression doit entièrement précéder la back référence dans la RE. Les sous expressions sont numérotées dans l'ordre de leur premières parenthèses. Les parenthèses non-capturantes ne définissent pas de sous expressions.
Il y a une ambiguïté inhérente historique entre les échappements caractère-entrée octal et les back références, qui est résolue par heuristique, comme dévoilé plus haut. Un zéro en tête indique toujours un échappement octal. Un seul chiffre différent de zéro, non suivi par un autre chiffre, est toujours interprété comme une back référence. Une séquence multi-chiffre ne commençant pas avec un zéro est interprétée comme une back référence si elle est située après une sous expression convenable (ex. le nombre est dans l'intervalle légal pour une back référence), et autrement est interprétée comme octale.
Méta syntaxe
En plus de la syntaxe principale décrite plus haut, il y a quelques formes spéciales et diverses facilités syntaxiques disponibles.
Normalement la sorte de RE utilisée est spécifiée par l'application. Néanmoins, ceci peut être modifié par un director. Si un RE d'une sorte quelconque commence avec ***:, le reste de la RE est une ARE. Si une RE d'une sorte quelconque commence avec ***=, le reste de la RE est pris comme une chaîne littérale, avec tous les caractères considérés comme des caractères ordinaires.
Une ARE peut commencer avec des contenue options: une séquence (?xyz) (où xyz est un ou plusieurs caractères alphabétiques) spécifie les options affectant le reste de la RE. Ceci vient en supplément, et peut modifier toute option spécifiée par l'application. Le lettres d'option disponibles sont:
- b le reste de la RE est une BRE
- c correspondance sensible à la casse (par défaut)
- e le reste de la RE est une ERE
- i correspondance insensible à la casse (voir correspondances, ci-dessous)
- m synonyme historique de n
- n correspondance sensible au saut de ligne(voir correspondances, ci-dessous)
- p correspondance partiellement sensible au saut de ligne (voir correspondances, ci-dessous)
- q le reste de la RE est une chaîne littérale (“entre guillemets”), toute de caractères ordinaires
- s correspondance insensible au saut de ligne (par défaut)
- t syntaxe serrée (par défaut; voir ci-dessous)
- w correspondance inverse partiellement sensible au saut de ligne (“weird”) (voir correspondances, ci-dessous)
- x syntaxe expansée (voir ci-dessous)
Les options incluses prennent effet à la ) terminant la séquence. Elles sont disponibles seulement au début d'une ARE, et ne peuvent pas être utilisées plus loin.
En plus de la syntaxe usuelle (tight) RE, dans laquelle tous les caractères sont signifiants, il y a une syntaxe expansée, disponible dans toutes les sortes de RE avec le switch -expanded, ou dans les AREs avec l'option x. Dans la syntaxe expansée, les espaces sont ignorés et tout caractère entre un # et les newline suivantes (ou la fin de la RE) sont ignoré, permettant de paragrapher et de commenter une RE complexe. Il y a trois exceptions à cette règle de base :
- un espace ou un # précédés par \ est retenu
- un espace ou un # à l'intérieur d'une expression crochet est retenu
- un espace et des commentaires sont illégaux dans les symboles multi-caractères comme le (?: ARE ou le \( BRE
Les caractères espace de la syntaxe expansée sont le blank, tab, newline, et tout caractère qui appartient à la classe de caractère space.
Finalement, dans une ARE, en dehors des expressions crochet, la séquence (?#ttt) (où ttt est un texte quelconque ne contenant pas de )) est un commentaire, complètement ignoré. De même, ceci n'est pas autorisé entre les caractères de symboles multi-caractère comme (?:. Ces commentaires sont plus un artefact historique que une utile facilité, et leur usage est obsolète; utilisez plutôt la syntaxe expansée de.
Aucune de ces extensions de méta-syntaxe ne sont disponibles si l'application (ou un director initial ***=) a spécifié que les entrées de l'utilisateur doivent être traitées comme une chaîne littérale plutôt que comme une RE.
Correspondances
Dans l’événement où une RE peut correspondre à plus d'une sous chaîne d'une chaîne donnée, la RE correspond à la première occurrence dans la chaîne. Si la RE peut correspondre à plus d'une sous chaîne commençant à ce point, le choix est déterminé par sa préférence: soit la plus longue sous chaîne, soit la plus courte.
La plupart des atomes, et toutes les contraintes, n'ont pas de préférence. Une RE entre parenthèses a la même préférence (éventuellement aucune) que la RE. Un atome quantifié avec {m} ou {m}? a la même préférence (éventuellement aucune)que l'atome lui-même. Un atome quantifié avec d'autres quantificateurs normaux (incluant {m,n} avec m égal à n) préfère la correspondance la plus longue. Un atome quantifié avec d'autre quantificateurs non-greedy (incluant {m,n}? avec m égal à n) préfère la correspondance la plus courte. Une branche a la même préférence que le premier atome quantifié inclus qui a une préférence. Une RE consistant de deux branches ou plus connectées par l'opérateur | préfère la correspondance la plus longue.
Sujettes aux contraintes imposées par les règles de correspondance à la totalité de la RE, les sous-expressions correspondent au sous-chaînes les plus longues ou les plus courtes possible, basées sur leurs preferences, avec les sous-expressions commençant en premier dans la RE prioritaires sur celles commençant plus loin. Notez que les sous-expressions prennent le pas sur leurs sous-expressions internes.
Notez que les quantificateurs {1,1} et {1,1}? peuvent être utilisés pour forcer la préférence, sur une sous-expression ou une RE complète.
Les longueurs des correspondances sont mesurées en caractères, pas en éléments d'assemblage. Une chaîne vide est considérée plus longue qu'aucune correspondance. Par exemple, bb* correspond aux trois caractères cebtraux de abbbc, (week|wee)(night|knights) correspond aux dix caractères de weeknights, quand (.*).* est comparé à abc la sous-expression entre parenthèses correspond aux trois caractères, et quand (a*)* est comparé à bc à la fois la RE complète et la sous-expression entre parenthèses correspond à une chaîne vide.
Si une correspondance indépendante de la casse est spécifiée, l'effet est le même que si toute distinction de casse avait disparu de l'alphabet. Quand un caractère qui existe dans les deux casses apparaît comme un caractère ordinaire en dehors d'une expression crochet, il est effectivement transforme en une expression crochet contenant les deux casses, ainsi x devient [xX]. Quand il apparaît dans une expression crochet, toute contrepartie de sa casse est ajoutée à l'expression crochet, ainsi [x] devient [xX] et [^x] devient [^xX].
Si une correspondance sensible au saut de ligne est spécifiée, les expressions . et crochets utilisant ^ ne correspondront jamais au caractère newline (ainsi la correspondance ne traverse jamais les saut de lignes à moins que la RE le demande explicitement ) et ^ et $ correspondront à la chaîne vide respectivement après et avant un saut de ligne, en plus de correspondre respectivement au début et à la fin d'une chaîne. Les \A et \Z ARE continuent à correspondre au début et à la fin d'une chaîne seulement.
Si une correspondance sensible au saut de ligne partielle est spécifiée, elle affecte les expressions . et crochets comme la correspondance sensible au saut de ligne, mais pas ^ et $.
Si une correspondance sensible au saut de ligne partielle inverse est spécifiée, elle affecte ^ et $ comme la correspondance sensible au saut de ligne, mais pas les expressions . et crochets. Ceci n'est pas très utile mais est fourni pour la symétrie
Limites et compatibilité
Aucune limite particulière n'est imposée à la longueur des REs. Les programmes conçue pour être hautement portables ne devront pas employer de REs plus longues que 256 octets, car une implémentation POSIX-compatible peut les refuser.
La seule fonctionnalité des AREs actuellement incompatible avec les EREs POSIX est que \ ne perd pas sa signification spéciale à l'intérieur des expression crochets. Toutes les autres fonctionnalités ARE utilisent une syntaxe qui est illégale ou a des effets indéfinis ou non specifiés dans les EREs POSIX; la syntaxe [24] des directors est de même en dehors de la syntaxe POSIX pour les BREs et les EREs.
Beaucoup des extensions ARE sont extraites de Perl, mais quelques unes ont été nettoyées, et quelques extensions Perl ne sont pas présentes. Les incompatibilités incluent \b, \B, l'absence de traitement spécial pour un newline à la fin, l'addition d'expression crochets pour les cas affectés par la correspondance sensible au saut de ligne, les restrictions sur les parenthèses et les back références dans les contraintes avant, et la sémantique des correspondances plus long/plus court (plutôt que premier-trouvé).
Les règles de correspondance pour les REs contenant à la fois des quantificateurs normaux et non-greedy ont changé depuis les premières versions beta-test de ce package. (Les nouvelles règles sont plus simples et plus propre, mais ne travaillent pas trop dur pour deviner les intentions réelles de l'utilisateur.)
Le package original regexp de 1986 par Henry Spencer, toujours largement utilisé (ex., dans les pre-8.1 releases de Tcl), implémentait une première version des EREs d'aujourd'hui. Il y a quatre incompatibilités entre les regexp proches des EREs (RREs) et les AREs. Dans un ordre croissant de signification:
Dans les AREs, \ suivi d'un caractère alphanumérique est soit un échappement soit une erreur, alors que dans les RREs, c'était juste un autre moyen d'écrire l'alphanumérique. Ceci ne sera pas une problème parce que il n'y a pas de raison d'écrire une séquence pareille dans les RREs.
Un { suivi d'un chiffre dans un ARE est le début d'un intervalle, alors que dans les RREs, { a toujours été un caractère ordinaire. De telles séquences seront rares, et donneront souvent une erreur parce que les caractères suivants ne ressembleront pas à un intervalle valide.
Dans les AREs, \ introduit un caractère spécial dans [], donc un \ littéral dans [] doit être écrit \\.
donne aussi un \ littéral dans [] dans les RREs, mais seuls les programmeurs vraiment paranoïaques doublent le backslash par routine.
AREs rapporte la plus longue/plus courte correspondance de la RE, plutôt que le premier trouvé dans l'ordre de recherche spécifié. Ceci peut affecter quelque RREs qui aurait été écrites dans l'hypothèse où la première correspondance serait rapportée. (La rédaction soigneuse des RREs pour optimiser l'ordre de recherche pour une comparaison rapide est obsolète (les AREs examinent toutes les correspondances possible en parallèle, et leurs performances sont largement insensible à leur complexité) mais les cas où l'ordre de recherche a été exploité pour trouver delibérément une correspondance qui n'est pas la plus longue/plus courte devront être réécrits.)
Expressions rationnelles basiques
Les BREs diffèrent des EREs sous plusieurs aspects:
- |, +, et ? sont des caractères ordinaires et il n'y a pas d'équivalent à leurs fonctionnalité.
- Les délimiteurs des intervalles sont \{ et \}, avec les { et } interprétées seules comme des caractères ordinaires.
- Les parenthèses des sous expressions imbriquées sont \( et \), avec les ( et ) interprétées seules comme des caractères ordinaires.
- ^ est un caractère ordinaire excepté au début de la RE ou au début d'une sous expressions entre parenthèses, $ est un caractère ordinaire excepté à la fin de la RE ou la fin d'une sous expressions entre parenthèses, et [24] est un caractère ordinaire s'il apparaît au début de la RE ou au début d'une sous-expression entre parenthèses (après un ^possible en tête).
- Finalement, les back références à un seul chiffre sont disponibles, et \< et \> sont des synonymes de [[:<:]] et [[:>:]] respectivement; aucun autre échappement ne sont disponibles