ホームページ  >  記事  >  Java  >  Java で \"test\".replaceAll(\".\", \"a\") の結果が \"aa\" になるのはなぜですか?

Java で \"test\".replaceAll(\".\", \"a\") の結果が \"aa\" になるのはなぜですか?

DDD
DDDオリジナル
2024-11-01 06:07:31507ブラウズ

Why Does

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。