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
.