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>
Nach dem Login kopieren
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!