Heim > Java > javaLernprogramm > Hauptteil

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

Barbara Streisand
Freigeben: 2024-10-31 02:51:31
Original
805 Leute haben es durchsucht

Why does String.replaceAll(

String.replaceAll(regex) Übereinstimmungsverhalten

Die seltsame Beobachtung, dass String.replaceAll(".*", "a") resultiert in „aa“ wirft Fragen über die Natur der .*-Regex auf.

Matching Anything

.* entspricht einer beliebigen Zeichenfolge, sogar einer leeren Zeichenfolge. Daher umfasst die erste Übereinstimmung die gesamte Eingabezeichenfolge, was die Regex-Engine dazu veranlasst, beginnend am Ende nach nachfolgenden Übereinstimmungen zu suchen.

Allerdings kann .* auch mit einer leeren Zeichenfolge am Ende der Eingabe übereinstimmen. Daher findet es eine zweite Übereinstimmung und ersetzt diese durch ein „a“, was zum Ergebnis „aa“ führt.

Mit . und .replaceFirst()

Um dieses Verhalten zu verhindern, verwenden Sie . stattdessen, da mindestens ein übereinstimmendes Zeichen erforderlich ist. Alternativ können Sie .replaceFirst() verwenden, um die Ersetzung auf das erste Vorkommen zu beschränken.

Verhaltenserklärung

Die Tatsache, dass .* mit einer leeren Zeichenfolge übereinstimmt, ist eigenartig und verdient eine eingehendere Untersuchung . Im Gegensatz zu den meisten Regex-Engines verschiebt die Regex-Engine von Java nach einer zweiten Übereinstimmung mit .* ein Zeichen weiter in der Eingabe. Diese Abweichung wird in der folgenden Abbildung deutlich:

<code class="text"># Before first run
regex: |.*
input: |whatever
# After first run
regex: .*|
input: whatever|
# Before second run
regex: |.*
input: whatever|
# After second run: since .* can match an empty string, it is satisfied...
regex: .*|
input: whatever|
# However, this means the regex engine matched an empty input.
# All regex engines, in this situation, will shift
# one character further in the input.
# So, before third run, the situation is:
regex: |.*
input: whatever<|ExhaustionOfInput>
# Nothing can ever match here: out</code>
Nach dem Login kopieren

Es ist jedoch zu beachten, dass andere Regex-Engines wie GNU sed die Eingabe nach dem ersten Treffer als erschöpft betrachten.

Das obige ist der detaillierte Inhalt vonWarum führt String.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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!