Heim > Java > javaLernprogramm > Warum führt „String.replaceAll(regex)' mehrere Ersetzungen durch, wenn der reguläre Ausdruck mit allem übereinstimmt?

Warum führt „String.replaceAll(regex)' mehrere Ersetzungen durch, wenn der reguläre Ausdruck mit allem übereinstimmt?

Linda Hamilton
Freigeben: 2024-11-01 00:35:02
Original
735 Leute haben es durchsucht

Why does `String.replaceAll(regex)` perform multiple replacements when the regex matches everything?

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

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

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage