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 .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow