Regular Expressions
Rekursion
Suche…
Bemerkungen
Rekursion ist meist in Perl-kompatiblen Geschmacksrichtungen verfügbar, z.
- Perl
- PCRE
- Oniguruma
- Boost
Rekurse das gesamte Muster
Das Konstrukt (?R)
ist äquivalent zu (?0)
(oder \g<0>
) - es lässt Sie das gesamte Muster rekursieren:
<(?>[^<>]+|(?R))+>
Dadurch werden richtig ausgeglichene spitze Klammern mit einem beliebigen Text zwischen den Klammern abgeglichen, wie <a<b>c<d>e>
.
Rekurse in ein Submuster
Sie können mit den folgenden Konstrukten (abhängig vom Flavour) in ein Submuster rekursieren, vorausgesetzt, n
ist eine Erfassungsgruppennummer und name
den Namen einer Erfassungsgruppe.
-
(?n)
-
\g<n>
-
\g'0'
-
(?&name)
-
\g<name>
-
\g'name'
-
(?P>name)
Das folgende Muster:
\[(?<angle><(?&angle)*+>)*\]
Passt zu Text wie: [<<><>><>]
- gut ausbalancierte spitze Klammern in eckigen Klammern. Rekursion wird häufig für das Abgleichen von ausgeglichenen Konstrukten verwendet.
Subpattern-Definitionen
Mit dem Konstrukt (?(DEFINE)
... )
können Sie Submuster definieren, auf die Sie später durch Rekursion verweisen können. Wenn es im Muster vorkommt, wird es nicht abgeglichen.
Diese Gruppe sollte benannte Subpattern-Definitionen enthalten, auf die nur durch Rekursion zugegriffen werden kann. Sie können Grammatiken auf diese Weise definieren:
(?x) # ignore pattern whitespace
(?(DEFINE)
(?<string> ".*?" )
(?<number> \d+ )
(?<value>
\s* (?:
(?&string)
| (?&number)
| (?&list)
) \s*
)
(?<list> \[ (?&value) (?: , (?&value) )* \] )
)
^(?&value)$
Dieses Muster überprüft den Text wie folgt:
[42, "abc", ["foo", "bar"], 10]
Beachten Sie, wie eine Liste einen oder mehrere Werte enthalten kann, und ein Wert kann selbst eine Liste sein.
Relative Gruppenreferenzen
Untermuster können mit ihrer relativen Gruppennummer referenziert werden:
-
(?-1)
wird in die vorherige Gruppe aufgenommen -
(?+1)
kehrt in die nächste Gruppe zurück
Kann auch mit der \g<N>
-Syntax verwendet werden.
Rückreferenzen in Rekursionen (PCRE)
In PCRE werden übereinstimmende Gruppen, die vor einer Rekursion für Rückreferenzen verwendet werden, in der Rekursion beibehalten. Aber nach der Rekursion haben sie sich alle auf das zurückgesetzt, was sie waren, bevor sie betreten wurden. Mit anderen Worten, übereinstimmende Gruppen in der Rekursion werden alle vergessen.
Zum Beispiel:
(?J)(?(DEFINE)(\g{a}(?<a>b)\g{a}))(?<a>a)\g{a}(?1)\g{a}
Streichhölzer
aaabba
Rekursionen sind atomar (PCRE)
In PCRE wird kein Trackback durchgeführt, nachdem der erste Treffer für eine Rekursion gefunden wurde. So
(?(DEFINE)(aaa|aa|a))(?1)ab
passt nicht zusammen
aab
denn nachdem es in der Rekursion mit aa
übereinstimmte, versuchte es nie wieder, nur a
.