ホームページ  >  記事  >  Java  >  正規表現がすべてに一致する場合に、「String.replaceAll(regex)」が複数の置換を実行するのはなぜですか?

正規表現がすべてに一致する場合に、「String.replaceAll(regex)」が複数の置換を実行するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-01 00:35:02622ブラウズ

Why does `String.replaceAll(regex)` perform multiple replacements when the regex matches everything?

String.replaceAll(regex) がすべてに一致する正規表現に対して複数の置換を実行する理由

Java では、String.replaceAll() メソッドにより次のことが可能になります。正規表現パターンのすべての出現を指定された置換で置き換えます。ただし、正規表現が入力文字列全体と一致する場合、予期しない動作が発生し、複数の置換が行われる可能性があります。

次の例を考えてみましょう。

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

このコードは、代わりに "aa" を出力します。予想される「a」。この異常は、正規表現 .* が空の文字列を含む任意の文字列と一致するために発生します。

最初の一致の後、正規表現エンジンは、正規表現の末尾から開始して別の出現箇所を見つけようとします。入力。ただし、.* は空の文字列と一致する可能性があり、この一致は入力の最後で行われます。したがって、正規表現エンジンは、この空の位置を「a」に置き換えます。

この動作を回避し、単一の置換を確実にするには、代わりに .* 式を使用することを検討してください。これには、正規表現が少なくとも 1 文字と一致する必要があります。したがって、空の文字列と一致することはできません。

代わりに、指定された正規表現の最初の出現のみを置換する String.replaceFirst() メソッドを使用することもできます。

例:

<code class="java">"test".replaceFirst(".*", "a")</code>

このコードは、「a」の目的の出力を生成します。

すべての正規表現エンジンが複数の一致に関して同じように動作するわけではないことに注意してください。たとえば、GNU sed は、最初の一致後に入力が使い果たされたとみなして、それ以上の置換を防ぎます。

以上が正規表現がすべてに一致する場合に、「String.replaceAll(regex)」が複数の置換を実行するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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