perl regex zum Extrahieren von mehrzeiligen Blöcken

8

Ich habe einen solchen Text:

%Vor%

Also, ich habe kein Blockende, nur einen neuen Blockstart.

Ich möchte alle Blöcke rekursiv erhalten:

%Vor%

usw.

Der folgende Code gibt mir nur das:

%Vor%

Was mache ich falsch?

%Vor%     
cristi 14.05.2012, 12:28
quelle

3 Antworten

2

Dies sollte den Trick machen. Der Anfang des nächsten \ d \ d: \ d \ d wird als Blockende behandelt.

%Vor%     
tuxuday 14.05.2012, 12:42
quelle
4

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%     
Greg Bacon 14.05.2012 13:26
quelle
0

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%     
TLP 14.05.2012 12:42
quelle

Tags und Links