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>
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!