Ich habe den folgenden Text
%Vor% Nach diesem Buch, das ich lese, wird, wenn die ?
nach irgendeinem Quantifizierer folgt, nicht gierig.
Meine Regex to*?n
gibt immer noch tooooooooooooon
zurück.
Es sollte ton
zurückgegeben werden, oder?
Irgendeine Idee warum?
Ein regulärer Ausdruck kann nur einem Textfragment entsprechen, das tatsächlich existiert.
Da die Teilzeichenfolge 'ton' in Ihrer Zeichenfolge nirgends vorhanden ist, kann sie nicht das Ergebnis einer Übereinstimmung sein. Bei einer Übereinstimmung wird nur eine Teilzeichenfolge der ursprünglichen Zeichenfolge zurückgegeben
EDIT: Um klar zu sein, wenn Sie die Zeichenfolge unten mit einem zusätzlichen 'n'
verwenden %Vor%Dieser reguläre Ausdruck (der keine o's angibt)
%Vor%würde dem folgenden entsprechen (so viele Zeichen wie möglich vor einem 'n')
%Vor%aber der reguläre Ausdruck
%Vor%würde nur dem folgenden entsprechen (so wenige Zeichen wie möglich vor einem 'n')
%Vor%Ein regulärer Ausdruck ist immer darauf aus zu passen.
Dein Ausdruck sagt das:
%Vor%Das bedeutet, dass alle notwendigen o's übereinstimmen, weil am Ende ein 'n' vorhanden ist, das der Ausdruck unbedingt erreichen möchte. Übereinstimmend mit allen o ist es nur die Möglichkeit, erfolgreich zu sein.
Regexps versuchen, alles in ihnen zusammenzubringen. Da es nicht weniger 'O' gibt als jedes O in Toooon, um mit dem N übereinzustimmen, ist alles abgestimmt. Auch weil du o * benutzt? statt o +? Du brauchst kein O, um anwesend zu sein.
Beispiel in Perl
%Vor% Der Regex tut immer sein Bestes, um zu passen. Das einzige, was Sie in diesem Fall tun, wäre, Ihren Parser zu verlangsamen, indem Sie ihn in den Knoten /o*?/
zurückverfolgen. Einmal für jedes einzelne 'o'
in "tooooon"
. Während bei normalem Matching, würde es so viele 'o'
s dauern, wie es beim ersten Mal möglich ist. Da das nächste übereinstimmende Element 'n'
ist, das nicht mit 'o'
übereinstimmt, ist es wenig sinnvoll, minimale Übereinstimmung zu verwenden. Wenn der normale Abgleich fehlschlägt, würde es tatsächlich eine ganze Weile dauern, bis der Abgleich fehlschlägt. Es muss durch jedes 'o'
zurückgehen, bis niemand mehr zurückkommt. In diesem Fall würde ich tatsächlich die maximale Übereinstimmung /to*+n/
verwenden. Das 'o'
würde alles nehmen, was es könnte, und niemals etwas davon zurückgeben. Dies würde es so machen, dass wenn es fehlschlägt, es schnell versagt.
(HINWEIS: Ähnlich für maximale RE)
%Vor%Tags und Links regex regex-greedy