2

私はJavaでこのメソッドをよく使用replace(CharSequence,CharSequence)しますが、今日、私は本当に理解できない何かに遭遇しました。

私がする時 :

"|||".replace("||","| |");

なぜ結果は:| ||であり、そうではないの| | |ですか?|2番目を2つのパターンに含めることができないのはなぜですか?

私の問題を解決するために、私は"|||".replace("||","| |").replace("||","| |");少し冗長に見えるものを書かなければなりません。

背後にあるメカニズムをよりよく理解するのに役立つ説明がありますか?

編集

したがって、これはjavadocで指定されている特定のケースであると言われていますが、間違っている例は次のとおりです。

 * The replacement proceeds from the beginning of the string to the end, for
 * example, replacing "aa" with "b" in the string "aaa" will result in
 * "ba" rather than "ab".

したがって、結果「ba」は「aa」と一致しなくなったため、私の場合とは異なります。私の場合、結果は「|||」です。まだパターンが含まれています。

4

5 に答える 5

3

混乱を引き起こす可能性のある2つのことがここで起こっています。まず、replace同じ文字を2回処理しないため、真ん中|は1回の置換にのみ適用できます。次に、replaceは置換文字を処理しないため、最初の置換の後にはがあります| ||が、2番目|は最初の置換の一部です。

つまり、基本的には、1回の置換後に、最初の||置換が行われ、残りは|一致しないため、置換が完了します。

于 2012-05-03T14:29:25.447 に答える
1

replace()期待どおりに動作する理由には、次の2つの可能性があります。

  1. 重複する一致を考慮することができます(この例では、文字1と2を一致させ、次に2と3を一致させます)。それはしません。

  2. 再帰的に置換する可能性があります。つまり、置換の結果として追加/変更されたものは、さらに一致する資格があります。これも行いません。

于 2012-05-03T14:28:26.140 に答える
1

置換は、元の文字列で検索する文字シーケンスを確認することから始まり、見つかったら、一致は開始しstartて終了します。その部分を置換で置き換えてから、その位置endから次の一致を探し続けます。end + 1

于 2012-05-03T14:30:13.653 に答える
1

理由についての答えではありませんが、それは良いことです

"|||".replace("||","| |");

結果はありません"| | |"。それが結果である場合、それは、置換がすでに行われたストリングの一部でも置換が実行されることを意味します。これにより、無限ループの記述が非常に簡単になります。たとえば、文字列が非常に大きくなり、メモリが不足するまで"|".replace("|", "||" );結果になります。"||||||...."

于 2012-05-03T15:24:20.907 に答える
0

あなたが探しているのは

"|||".replace("|","| "); 

また

"|||".replace("|","| ").trim();

最後のスペースが必要ない場合。

なぜ私はあなたに自習させたのですか。ヒント:正規表現の置換を検索します。

于 2012-05-03T14:34:24.177 に答える