Programmierfehler führt zu unerklärlichen Regex

8

für einen Test, den ich nach dem Regex versehentlich erstellt habe:

%Vor%

Ich war verwirrt, dass diese Regex wirklich funktioniert und ich kann das Ergebnis nicht erklären:

%Vor%

das Ergebnis ist:

%Vor%

Meine bisherigen Ideen sind, dass Java versucht, "nichts" zwischen den Charakteren zu ersetzen, aber warum nicht die Charaktere selbst?

\w+ sollte mit 'H'

übereinstimmen

Ich würde erwarten, dass jedes Zeichen durch 3 @ Zeichen oder nur durch eins ersetzt wird, aber dass die Zeichen nicht ersetzt werden, verwirren mich.

    
Joachim Weiß 05.05.2015, 12:29
quelle

1 Antwort

4

Sie haben Recht, diese Regex stimmt mit der leeren Zeichenfolge zwischen den einzelnen Zeichen überein.

Da die erste Alternative (der leere String links von | ) übereinstimmt, wird der Rest des Musters nicht einmal ausprobiert, so dass die \w+ von der passenden Engine nicht einmal erreicht wird. Sie hätten ein beliebiges (gültiges) Muster rechts von diesem ersten | schreiben können, es würde niemals erreicht werden.

Die Engine funktioniert folgendermaßen: Sie hat einen aktuellen Position -Cursor in der Betreffzeile. Es versucht, ab dieser aktuellen Position zu beginnen. Da Ihre Regex eine Übereinstimmung ist, führt sie an dieser Stelle die Ersetzung durch und verschiebt dann die aktuelle Position -Cursor nach der gefundenen Übereinstimmung.

Aber da die Übereinstimmung Null-Breite ist, geht es einfach zum nächsten Zeichen weiter, weil das nicht zu einer Endlosschleife führen würde.

    
Lucas Trzesniewski 05.05.2015, 12:31
quelle

Tags und Links