Die anderen Antworten hier geben keine vollständige Lösung für Regex-Versionen an, die kein Non-Greedy-Matching unterstützen. Die gierigen Quantoren ( .*?
, .+?
usw.) sind eine Perl 5-Erweiterung, die in herkömmlichen regulären Ausdrücken nicht unterstützt wird.
Wenn Ihre Abbruchbedingung ein einzelnes Zeichen ist, ist die Lösung einfach: Anstelle von
a(.*?)b
können Sie mit
a[^ab]*b
d.h. eine Zeichenklasse angeben, die die Anfangs- und Endzeichen ausschließt.
Im allgemeineren Fall können Sie akribisch einen Ausdruck konstruieren wie
start(|[^e]|e(|[^n]|n(|[^d])))end
zur Erfassung einer Übereinstimmung zwischen start
und das erste Vorkommen von end
. Beachten Sie, dass der Unterausdruck mit den verschachtelten Klammern eine Reihe von Alternativen angibt, die zusammen Folgendes ermöglichen e
nur, wenn es nicht gefolgt wird von nd
und so weiter, und achten Sie auch darauf, die leere Zeichenkette als eine Alternative abzudecken, die nicht mit dem übereinstimmt, was an diesem bestimmten Punkt nicht erlaubt ist.
Natürlich ist es in den meisten Fällen richtig, einen geeigneten Parser für das zu analysierende Format zu verwenden, aber manchmal ist ein solcher vielleicht nicht verfügbar, oder das von Ihnen verwendete Spezialwerkzeug besteht auf einem regulären Ausdruck und sonst nichts.
0 Stimmen
Was ist Ihre Quelle, ist es HTML oder xml oder etwas anderes?
2 Stimmen
Nun, die Quelle ist eine XML-Datei, aber ich fülle bestimmte Tags in eine Textdatei ein. Für meine Zwecke wird diese Regex wahrscheinlich ausreichen.