Joseph Tux

Parenthèses non capturantes dans les expressions rationnelles de Perl

mardi 11 janvier 2011

Les parenthèses simples sont utiles pour capturer une ou plusieurs séquences dans une chaine reconnue par l’ expression rationnelle. Mais elle sont couteuses en mémoire et autres ressources.

Pour regrouper des éléments, il existent donc les parenthèses non-capturantes.

Des conditions de reconnaissance d’une partie de chaine en fonction de critères peuvent aussi être indiquées avec des notations parenthèsées.

  • Ces parenthèses ne comptent pas dans la numérotation des captures
  • La notation spéciale ne concerne pas la parenthese fermante, notée simplement « ) »  [1]

 GROUPEMENT

  1. (?:
    1. Avantage : économie de mémoire et de travail

 TEST AVANT

  1. (?= Condition positive
  2. (?! Condition négative
    1. La recherche peut continuer seulement s la condition est remplie
    2. Exemples
      1. Bill(?= The Cat | Clinton ) ne reconnaît Bill que s’il est suivi de « The Cat » ou de « Clinton »
      2. (?=(.*)) simuler $’ (économie d’énergie ++ )
      3. (?!000)\d\d\d ne reconnaître 3 chiffres que s’il ne sont pas « 000 »
        (et non pas « s’ils en sont pas précédés de »000")
      4. piège subtile _ \d+(?!\.) reconnaît 56789 dans ’F 56789’
        \d+(?=[^.] reconnaît 5678 dans ’F 56789’
        Pour reconnaître à coup sur un nombre sauf s’il est suivi d’un point , il faut écrire :
        \d+(?=[^.\d])

 TEST ARRIERE [2]

  • Ne fontionne qu’avec des regex de longueur fixe
  • Utile en cas d’alternative ou de quantificateur
  1. (?<= = ne pas revenir sur « une reconnaissance réussie »
  2. (?<! = ne pas revenir sur « aucune reconnaissance réussie »

 COMMENTAIRES [3]

  • Le modificateur /x permet d’ignorer les commentaires (et aussi les espaces) [4].
  1. (?# est traité comme un commentaire, c’est à dire ignoré, à condition d’échapper les copies du délimiteur d’opérante comme « / » ou «  » et «  » , qui sont les seuls habituellement recommandés ( sauf s’ils occupent aussi la regex )

 MODIFICATEURS [5]

  • les modificateurs comme /x /m /s /i ( /xmsi par exempel ! ), sont utilisables avec
  1. (?i) insensible à la casse
  2. (?x) commentaires et blancs ignorés
  3. (?m) multiligne (^ et $) Caractère nouvelle ligne reconnue au milieu d’une chaine
  4. (?s) simple ligne ( . ) Caractère nouvelle ligne = caractère ordinaire, et le point aussi
  5. et leurs combinaisons : (?xms)
    /ms = reconnaît tout avec le point (« multiligne propre » selon Chouette [6], p237 sqq)

[1] Pour une lecture plus simple, je n’expose ni la partie regex, ni la parenthèse fermante

[2] cf Damian Conway « De l’art de programmer en Perl », O’Reilly, ed. française, p275-277

[3] je ne vois pas bien l’intéret, puisqu’i y a /x

[4] Sauf les délimiteurs ( "/", "{" et "}" ) qui doivent être échappés

[5] à préciser - je ne vois pas l’intéret

[6] « Maîtrise des expressions régulières » Traduction Française, O’Reilly Jeffrey E.F.Friedl traduction : L.Dami


Accueil du site | Contact | Plan du site | | Statistiques du site | Visiteurs : 101 / 13140

Suivre la vie du site fr  Suivre la vie du site GNU, LINUX, BSD, LL  Suivre la vie du site AIDES GNU/LINUX  Suivre la vie du site PERL   ?

Site réalisé avec SPIP 2.1.13 + AHUNTSIC

Creative Commons License