String ReplaceAll 異常: ".*" による二重置換
Java では、String.replaceAll() メソッドがグローバル検索を実行し、正規表現を使用した指定された文字列の置換操作。ただし、「.*」正規表現パターンを使用すると予期しない動作が発生し、二重置換の問題が発生します。
この質問では、「test".replaceAll(".", "a ") の結果は "aa" になります。これは、 . が任意の数の文字 (0 を含む) に一致する貪欲な量指定子であり、最初に入力文字列全体をキャプチャするためです。その結果、最初の置換では文字列全体が "a."
に置き換えられます。ただし、. は空の文字列と一致することもあります。最初の置換の後、入力の最後に残っている空の文字列も . と一致するとみなされます。したがって、2 回目の置換が発生し、空の文字列が "a" に置き換えられ、最終的な出力は "aa."
になります。この二重置換の問題を回避するには、.* の代わりとなる .* を検討してください。 、少なくとも 1 文字が一致する必要があります。あるいは、replaceFirst() を使用すると、最初に出現した文字列のみが置換され、空の文字列が 2 回目に一致する状況が回避されます。
興味深いことに、一部の正規表現エンジンはこの二重置換動作を示しません。たとえば、GNU sed は、最初の一致後に入力が使い果たされたとみなして、それ以上の置換を防ぎます。ただし、Java の String.replaceAll() メソッドで「.*」を使用する場合は、この潜在的な異常に注意することが重要です。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3