Wie kann ich RegEx (.NET-Version) anweisen, die kleinste gültige Übereinstimmung anstelle der größten zu erhalten?
Wie kann ich RegEx (.NET-Version) anweisen, die kleinste gültige Übereinstimmung anstelle der größten zu erhalten?
Antworten:
Fügen Sie für einen regulären Ausdruck wie .*
oder .+
ein Fragezeichen ( .*?
oder .+?
) hinzu, um so wenig Zeichen wie möglich zuzuordnen. (?:blah)?
Verwenden Sie so etwas wie, um optional einen Abschnitt abzugleichen, jedoch ohne Übereinstimmung, sofern dies nicht unbedingt erforderlich ist (?:blah){0,1}?
. Fügen Sie für eine sich wiederholende Übereinstimmung (entweder mit {n,}
oder mit {n,m}
Syntax) ein Fragezeichen hinzu, um zu versuchen, so wenig wie möglich zu finden (z . B. {3,}?
oder {5,7}?
).
Die Dokumentation zu Quantifizierern für reguläre Ausdrücke kann ebenfalls hilfreich sein.
Der nicht gierige Operator , ?
. Wie so:
.*?
Der nicht gierige Operator bedeutet nicht die kürzestmögliche Übereinstimmung:
abcabk
a.+?k
stimmt mit der gesamten Zeichenfolge (in diesem Beispiel) überein, anstatt nur mit den letzten drei Zeichen.
Ich möchte stattdessen tatsächlich die kleinstmögliche Übereinstimmung finden.
Dies ist die letzte mögliche Übereinstimmung für ' a
', um noch alle Übereinstimmungen für zuzulassen k
.
Ich denke, der einzige Weg, dies zu tun, besteht darin, einen Ausdruck wie den folgenden zu verwenden:
a[^a]+?k
cab
. Wenn meine Eingabe ist caaacab
und ich danach suche a.*?b
, wird die vollständige Zeichenfolge anstelle der kurzen Übereinstimmung darin zurückgegeben. Wie würde ich von der rückwärts suchen b
?
START[^START]*?END
(wobei START und END Ihre regulären Regexe für Start- und Endzeichen sind). Es bedeutet im Wesentlichen "alles von START bis END
abcabk
unda.+?k
stimmt RegEx mit der gesamten Zeichenfolge überein.