ホームページ >Java >&#&チュートリアル >Java で \'test\'.replaceAll(\'.\', \'a\') の結果が \'aa\' になるのはなぜですか?
String ReplaceAll の異常: ".*" による二重置換
Java では、String.replaceAll() メソッドがグローバル検索を実行し、正規表現を使用した指定された文字列の置換操作。ただし、「.*」正規表現パターンを使用すると予期しない動作が発生し、二重置換の問題が発生します。
この質問では、「test".replaceAll(".", "a ") の結果は "aa" になります。これは、 . が任意の数の文字 (ゼロを含む) に一致する貪欲な量指定子であり、最初に入力文字列全体をキャプチャするためです。その結果、最初の置換では文字列全体が "a."
に置き換えられます。ただし、. は空の文字列と一致することもあります。最初の置換の後、入力の最後に残っている空の文字列も . と一致するとみなされます。したがって、2 回目の置換が発生し、空の文字列が "a" に置き換えられ、最終的な出力は "aa." となります。
この二重置換の問題を防ぐには、.* の代わりとなる .* を検討してください。 、少なくとも 1 文字が一致する必要があります。あるいは、replaceFirst() を使用すると、最初に出現した文字列のみが置換され、空の文字列が 2 回目に一致する状況が回避されます。
興味深いことに、一部の正規表現エンジンはこの二重置換動作を示しません。たとえば、GNU sed は、最初の一致後に入力が使い果たされたとみなして、それ以上の置換を防ぎます。ただし、Java の String.replaceAll() メソッドで「.*」を使用する場合は、この潜在的な異常に注意することが重要です。
以上がJava で \'test\'.replaceAll(\'.\', \'a\') の結果が \'aa\' になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。