In Version 5.10.0 wurden benannte Erfassungsgruppen eingeführt, die für die Zuordnung nützlich sind nichttriviale Muster.
(?'NAME'pattern)
(?<NAME>pattern)
Eine benannte Erfassungsgruppe. Identisch in jeder Hinsicht zu den normalen einfangenden Klammern
()
, aber für die zusätzliche Tatsache, dass die Gruppe in verschiedenen Konstrukten für reguläre Ausdrücke namentlich benannt werden kann (zB\g{NAME}
) und nach einer erfolgreichen Übereinstimmung über%+
oder%-
. Weitere Informationen zu perlvar . % LAST_PAREN_MATCH ">%+
und%-
Hashwerte.Wenn mehrere verschiedene Capture-Gruppen den gleichen Namen haben, bezieht sich
$+{NAME}
auf die am weitesten links stehende Gruppe in der Übereinstimmung.Die Formulare
(?'NAME'pattern)
und(?<NAME>pattern)
sind gleichwertig.
Benannte Capture-Gruppen ermöglichen es uns, Submuster innerhalb der Regex wie folgt zu benennen.
%Vor%Benutze es wie in
%Vor%Ausgabe:
%Vor% Dein Problem ist, dass .*?
nicht gierig ist, genauso wie .*
gierig ist. Wenn es nicht erzwungen wird, passt es so wenig wie möglich, was in diesem Fall die leere Zeichenfolge ist.
Du brauchst also nach dem nicht-gierigen Match etwas, um deine Aufnahme zu verankern. Ich kam mit dieser Regex:
%Vor% Wie Sie sehen, habe ich die Option /m
entfernt, um das Ende der Zeichenfolge in der Look-Ahead-Assertion genau zuordnen zu können.
Sie können diese Lösung auch in Betracht ziehen:
%Vor%