ホームページ >Java >&#&チュートリアル >`String.replaceAll(\'.*\', \'a\')` の結果が \'a\' ではなく \'aa\' になるのはなぜですか?

`String.replaceAll(\'.*\', \'a\')` の結果が \'a\' ではなく \'aa\' になるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-31 09:28:29752ブラウズ

Why does `String.replaceAll(

String.replaceAll() の二重置換異常について

なぜ次のコードが使用されるのかという疑問が生じます:

<code class="java">System.out.println("test".replaceAll(".*", "a"));</code>

結果は、予期される「a」ではなく「aa」になります。この異常は、「.*$」を使用する場合にも発生します。

原因:

この異常は、「.*」正規表現の性質から発生します。空の文字列を含む任意の文字シーケンスと一致します。したがって:

  • 最初の一致: “.*” は文字列「test」全体と一致し、それを「a」に置き換えます。
  • 2 番目の一致: 「.*」は、入力の最後にある空の文字列と一致することもあります。この 2 番目の一致により、空の文字列が「a」に置き換えられ、二重置換が行われます。

解決策:

この問題を回避するには、次の使用を検討してください。

  • .replaceFirst(): 最初に出現したもののみを置換し、二重置換。
  • 。 : 空の文字列を除く、1 つ以上の文字の任意の文字シーケンスと一致します。

正規表現の動作:

一方、 .* は空の文字列と一致します。 、2 回以上一致することはできません。これは次の理由によるものです。

  • 最初の一致の後、正規表現エンジンは 1 文字前にシフトします。
  • 2 番目の一致では、.* を使用して、最後にある空の文字列と一致します。
  • 正規表現エンジンは入力を使い果たし、別の文字を前にシフトします。
  • これ以上はありません.* の入力が一致するため、3 回目の置換が防止されます。

以上が`String.replaceAll(\'.*\', \'a\')` の結果が \'a\' ではなく \'aa\' になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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