„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum führt \"test\".replaceAll(\".\", \"a\") in Java zu \"aa\"?

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

Veröffentlicht am 10.11.2024
Durchsuche:647

Why Does \

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

In Java führt die String.replaceAll()-Methode 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. Infolgedessen ersetzt die erste Ersetzung die gesamte Zeichenfolge durch „a“.

Allerdings kann . auch mit einer leeren Zeichenfolge übereinstimmen. Nach der ersten Ersetzung gilt die am Ende der Eingabe verbleibende leere Zeichenfolge auch 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 „.*“ mit der String.replaceAll()-Methode in Java verwendet wird.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3