Regular Expressions
Récursivité
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 .