Heim > Java > javaLernprogramm > Warum führt \'test\'.replaceAll(\'.\', \'a\') in Java zu \'aa\'?

Warum führt \'test\'.replaceAll(\'.\', \'a\') in Java zu \'aa\'?

DDD
Freigeben: 2024-11-01 06:07:31
Original
629 Leute haben es durchsucht

Why Does

String-ReplaceAll-Anomalie: Doppelte Ersetzung durch „.*“

In Java führt die Methode String.replaceAll() eine globale Suche durch und Ersetzungsvorgang für eine bestimmte Zeichenfolge mithilfe eines regulären Ausdrucks. Bei Verwendung des Regex-Musters „.*“ tritt jedoch ein unerwartetes Verhalten auf, das zu einem Problem mit der doppelten Ersetzung führt.

Die Frage stellt ein Szenario dar, in dem „test“.replaceAll(“.“, „a ") ergibt als Ergebnis "aa". Dies liegt daran, dass . ein gieriger Quantifizierer ist, der mit einer beliebigen Anzahl von Zeichen (einschließlich Null) übereinstimmt und zunächst die gesamte Eingabezeichenfolge erfasst. Dadurch wird bei der ersten Ersetzung die gesamte Zeichenfolge durch „a“ ersetzt.

. kann jedoch auch mit einer leeren Zeichenfolge übereinstimmen. Nach der ersten Ersetzung gilt auch die am Ende der Eingabe verbleibende leere Zeichenfolge als Übereinstimmung für .. Somit erfolgt eine zweite Ersetzung, bei der die leere Zeichenfolge durch „a“ ersetzt wird, was zur endgültigen Ausgabe „aa“ führt.

Um dieses Problem der doppelten Ersetzung zu vermeiden, ziehen Sie Alternativen zu .* in Betracht, z. B. . , wofür mindestens ein übereinstimmendes Zeichen erforderlich ist. Alternativ ersetzt die Verwendung von replaceFirst() nur das erste Vorkommen und vermeidet so die Situation, in der eine leere Zeichenfolge ein zweites Mal gefunden wird.

Interessanterweise zeigen einige Regex-Engines dieses doppelte Ersetzungsverhalten nicht. Beispielsweise betrachtet GNU sed die Eingabe nach dem ersten Treffer als erschöpft und verhindert so weitere Ersetzungen. Es ist jedoch wichtig, sich dieser potenziellen Anomalie bewusst zu sein, wenn Sie „.*“ mit der String.replaceAll()-Methode in Java verwenden.

Das obige ist der detaillierte Inhalt vonWarum führt \'test\'.replaceAll(\'.\', \'a\') in Java zu \'aa\'?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage