RegEx: Kleinstmögliche Übereinstimmung oder nicht übereinstimmende Übereinstimmung

98

Wie kann ich RegEx (.NET-Version) anweisen, die kleinste gültige Übereinstimmung anstelle der größten zu erhalten?

Jonathan Allen
quelle

Antworten:

191

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.

DMI
quelle
7
Ich weiß nicht, ob ich der einzige bin, der dieses Missverständnis hat, aber es ist wichtig zu beachten: Es stimmt zwar, dass der nicht gierige Operator so wenig Zeichen wie möglich enthält, aber es ist möglicherweise immer noch nicht die Übereinstimmung, nach der man sucht zum. "So wenig Zeichen wie möglich" entspricht nicht "kürzestmögliche Übereinstimmung" in Bezug auf RegEx-Standards. Siehe die Antwort unter meinem Kommentar: Mit abcabkund a.+?kstimmt RegEx mit der gesamten Zeichenfolge überein.
Finefoot
Zeile 2 "aber ohne Übereinstimmung, sofern nicht unbedingt erforderlich": Was bedeutet das?
Raining
70

Der nicht gierige Operator , ?. Wie so:

.*?
David Hedlund
quelle
45

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

Jonathan
quelle
2
Oder suchen Sie in umgekehrter Reihenfolge, beginnend am Ende, wenn Übereinstimmungen verschachtelt sind: "(ab (abk) bk)".
LBogaardt
7
@LBogaardt wie würde man in umgekehrter Reihenfolge suchen? verstehe es nicht
azerafati
2
@LBogaardt Noch offene Frage: Wie würde man in umgekehrter Reihenfolge suchen? Sagen wir, ich möchte bekommen cab. Wenn meine Eingabe ist caaacabund 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?
C4d
3
Kehren Sie die Zeichenfolge um und wenden Sie dann den regulären Ausdruck an.
Jonathan Allen
3
Das ist super hilfreich. Für Leute wie mich, die versuchen zu verstehen, was hier vor sich geht, ist die generische Form 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
abgleichen,