String.replaceAll() Double Replacement Anomaly verstehen
Es stellt sich die Frage, warum der folgende Code:
<code class="java">System.out.println("test".replaceAll(".*", "a"));</code>
Ergebnisse in „aa“ anstelle des erwarteten „a“. Diese Anomalie tritt auch bei Verwendung von „.*$“ auf.
Ursache:
Die Anomalie ergibt sich aus der Natur des regulären Ausdrucks „.*“. Es entspricht jeder Zeichenfolge, einschließlich einer leeren Zeichenfolge. Deshalb:
-
Erster Treffer: „.*“ stimmt mit der gesamten Zeichenfolge „test“ überein und ersetzt sie durch „a.“
-
Zweiter Treffer : „.*“ kann auch mit einer leeren Zeichenfolge übereinstimmen, die am Ende der Eingabe gefunden wird. Dieser zweite Treffer ersetzt die leere Zeichenfolge durch „a“, was zu einer doppelten Ersetzung führt.
Lösung:
Um dieses Problem zu vermeiden, sollten Sie Folgendes verwenden:
-
.replaceFirst(): Ersetzt nur das erste Vorkommen und verhindert so die doppelte Ersetzung.
-
. : Entspricht jeder Zeichenfolge aus einem oder mehreren Zeichen, ausgenommen leere Zeichenfolgen.
Regex-Verhalten:
Während .* mit einer leeren Zeichenfolge übereinstimmen kann , es kann nicht mehr als zweimal übereinstimmen. Das liegt daran:
- Nach dem ersten Treffer verschiebt die Regex-Engine ein Zeichen nach vorne.
- Der zweite Treffer verwendet .*, um den leeren String abzugleichen, der jetzt am Ende steht der Eingabe.
- Die Regex-Engine erschöpft die Eingabe und verschiebt ein weiteres Zeichen nach vorne.
- Es gibt keine weitere Eingabe für .*, die übereinstimmt, wodurch eine dritte Ersetzung verhindert wird.
Das obige ist der detaillierte Inhalt vonWarum führt `String.replaceAll(\".*\", \"a\")` zu \"aa\" statt zu \"a\"?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn