Regulärer Ausdruck nongreedy ist gierig

7

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?

    
Vince Panuccio 29.10.2008, 09:32
quelle

5 Antworten

46

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%     
Gareth 29.10.2008, 09:36
quelle
5

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.

    
Tomalak 29.10.2008 09:44
quelle
4

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%     
Vinko Vrsalovic 29.10.2008 09:37
quelle
4

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.

Minimaler RE-Erfolg:

%Vor%

Normaler RE-Erfolg:

(HINWEIS: Ähnlich für maximale RE)

%Vor%

Fehler der minimalen RE:

%Vor%

Fehler des normalen RE:

%Vor%

Fehler der maximalen RE:

%Vor%     
Brad Gilbert 30.10.2008 02:01
quelle
2

Die Zeichenkette, in der Sie suchen (der Heuhaufen sozusagen) enthält nicht den Teilstring "ton".

Es enthält jedoch den Teilstring "tooooooooooooon".

    
Hank 29.10.2008 09:35
quelle

Tags und Links