Warum String.replaceAll(regex) mehrere Ersetzungen für reguläre Ausdrücke durchführt, die zu allem passen
In Java ermöglicht die Methode String.replaceAll() zum Ersetzen aller Vorkommen eines regulären Ausdrucksmusters durch eine angegebene Ersetzung. Wenn der reguläre Ausdruck jedoch mit der gesamten Eingabezeichenfolge übereinstimmt, kann ein unerwartetes Verhalten auftreten, das zu mehreren Ersetzungen führt.
Betrachten Sie das dargestellte Beispiel:
<code class="java">System.out.println("test".replaceAll(".*", "a"));</code>
Dieser Code gibt stattdessen „aa“ aus des erwarteten „a“. Diese Anomalie tritt auf, weil der reguläre Ausdruck .* mit jeder Zeichenfolge übereinstimmt, einschließlich einer leeren Zeichenfolge.
Nach der ersten Übereinstimmung versucht die Regex-Engine, ein weiteres Vorkommen zu finden, indem sie am Ende der Zeichenfolge beginnt Eingang. Allerdings kann .* mit einer leeren Zeichenfolge übereinstimmen, und diese Übereinstimmung erfolgt ganz am Ende der Eingabe. Daher ersetzt die Regex-Engine an dieser leeren Position ein „a“.
Um dieses Verhalten zu vermeiden und eine einzelne Ersetzung sicherzustellen, sollten Sie stattdessen den Ausdruck .* verwenden, der erfordert, dass der reguläre Ausdruck mit mindestens einem Zeichen übereinstimmt und kann daher nicht mit einer leeren Zeichenfolge übereinstimmen.
Alternativ können Sie die Methode String.replaceFirst() verwenden, die nur das erste Vorkommen des angegebenen regulären Ausdrucks ersetzt.
Zum Beispiel:
<code class="java">"test".replaceFirst(".*", "a")</code>
Dieser Code erzeugt die gewünschte Ausgabe von „a“.
Es ist erwähnenswert, dass sich nicht alle Regex-Engines bei mehreren Übereinstimmungen gleich verhalten. GNU sed beispielsweise betrachtet die Eingabe nach dem ersten Treffer als erschöpft und verhindert so weitere Ersetzungen.
Das obige ist der detaillierte Inhalt vonWarum führt „String.replaceAll(regex)' mehrere Ersetzungen durch, wenn der reguläre Ausdruck mit allem übereinstimmt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!