Recherche…


Remarques

La récursivité est principalement disponible en versions compatibles Perl, telles que:

  • Perl
  • PCRE
  • Oniguruma
  • Renforcer

Recurser le motif entier

La construction (?R) est équivalente à (?0) (ou \g<0> ) - elle vous permet de recréer tout le motif:

<(?>[^<>]+|(?R))+>

Cela correspondra entre crochets correctement équilibrés avec n'importe quel texte entre les crochets, comme <a<b>c<d>e> .

Recurser dans un sous-modèle

Vous pouvez Recurse dans un sous - motif en utilisant les constructions suivantes ( en fonction de l'arôme), en supposant que n est un numéro de groupe de capture, et name le nom d'un groupe de capture.

  • (?n)
  • \g<n>
  • \g'0'
  • (?&name)
  • \g<name>
  • \g'name'
  • (?P>name)

Le modèle suivant:

 \[(?<angle><(?&angle)*+>)*\]

Correspondra au texte tel que: [<<><>><>] - les crochets bien placés entre crochets. La récursivité est souvent utilisée pour les constructions équilibrées.

Définitions de Subpattern

La construction (?(DEFINE) ... ) vous permet de définir des sous-modèles que vous pouvez référencer ultérieurement via la récursivité. Lorsque rencontré dans le modèle, il ne sera pas mis en correspondance.

Ce groupe doit contenir des définitions de sous-modèle nommées, qui ne seront accessibles que par récursivité. Vous pouvez définir les grammaires de cette façon:

(?x) # ignore pattern whitespace
(?(DEFINE)
  (?<string> ".*?" )
  (?<number> \d+ )
  (?<value>
    \s* (?:
        (?&string)
      | (?&number)
      | (?&list)
    ) \s*
  )
  (?<list> \[ (?&value) (?: , (?&value) )* \] )
)
^(?&value)$

Ce modèle valide le texte comme suit:

[42, "abc", ["foo", "bar"], 10]

Notez comment une liste peut contenir une ou plusieurs valeurs, et une valeur peut elle-même être une liste.

Références de groupe relatives

Les sous-modèles peuvent être référencés avec leur numéro de groupe relatif :

  • (?-1) rentrera dans le groupe précédent
  • (?+1) rentrera dans le groupe suivant

Aussi utilisable avec la syntaxe \g<N> .

Backreferences en récurrences (PCRE)

Dans PCRE, les groupes correspondants utilisés pour les références avant une récursivité sont conservés dans la récursivité. Mais après la récursivité, ils ont tous ramené à ce qu'ils étaient avant d'y entrer. En d'autres termes, les groupes correspondants dans la récursivité sont tous oubliés.

Par exemple:

(?J)(?(DEFINE)(\g{a}(?<a>b)\g{a}))(?<a>a)\g{a}(?1)\g{a}

allumettes

aaabba

Les récurrences sont atomiques (PCRE)

Dans PCRE, il n'y a pas de rétrolien après la première correspondance pour une récursivité. Alors

(?(DEFINE)(aaa|aa|a))(?1)ab

ne correspond pas

aab

car après la correspondance avec aa dans la récursivité, il n'essaie plus jamais de faire correspondre seulement a .



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow