複数指定 - java 文字列 置換



String.replaceAllは自分で仕事をするよりもかなり遅いです (3)

replacereplaceAll正規表現を内部的に使用します。ほとんどの場合、 StringUtils.replace(..)と比較してパフォーマンスに大きな影響を与え StringUtils.replace(..)

String.replaceAll()

public String replaceAll(String regex, String replacement) {
        return Pattern.compile(regex).matcher(this ).replaceAll(
             replacement);
}

String.replaceAll()はPattern.compileを下に使います。

public String replace(CharSequence target, CharSequence replacement) {
  return Pattern.compile(target.toString(), Pattern.LITERAL)
         .matcher(this ).replaceAll(
           Matcher.quoteReplacement(replacement.toString()));
}

文字列内の部分文字列のすべての置換を参照してください。 これはJavaでより効率的ですか?

文字列内のトークンの検索と置換を行う古いコードがあります。

これは、ペアfromマップを受け取って、それらを反復し、それらのペアのそれぞれに対して、ターゲット文字列を反復し、 indexOf()を使用してfromを探し、 toの値に置き換えます。 これはStringBufferすべての作業を行い、最終的にString返します。

私はこのコードをこの行に置き換えました: replaceAll("[,. ]*", "");
私はいくつかの比較パフォーマンステストを実行しました。
1,000,000回の反復を比較すると、私はこれを得ました:

旧コード:1287ms
新しいコード:4605ms

3倍長く!

私はそれから3つの呼び出しをreplaceしようとしreplace
replace(",", "");
replace(".", "");
replace(" ", "");

この結果、次の結果が得られました。

旧コード:1295
新しいコード:3524

2倍長く!

なぜreplacereplaceAllreplaceAllはないのですか? 早くするために何かできますか?

編集:すべての答えをありがとう - 主な問題は確かに[,. ]* [,. ]*私がしたかったことをしなかった。 それを[,. ]+ [,. ]+非Regexベースのソリューションのパフォーマンスとほぼ同等でした。 あらかじめコンパイルされた正規表現を使うと助けになりましたが、限界がありました。 (これは私の問題に非常に適した解決策です。

テストコード:
文字列をRegex:[、、。 ] *
文字列をRegex:[、、。 ] +
文字列をRegex:[、、。 ] +およびPre-Compiled Pattern


Answer #1

replaceAll("[,. ]*", "")に関しては、正規表現に依存しているのでそれほど驚きはありません。 正規表現エンジンは入力に対して実行されるオートマトンを作成します。 若干のオーバーヘッドが予想されます。

2番目のアプローチ( replace(",", "")... )では正規表現も内部的に使用されます。 ただし、与えられたパターンはPattern.LITERALを使ってコンパイルされるので、正規表現のオーバーヘッドは無視してください。)この場合はおそらくStringsが不変であることが原因です(小さな変更を行い、新しい文字列を作成します)。したがって、インプレースの文字列を操作するStringBuffersほど効率的ではありません。


Answer #2

私がコメントに入れたように[、。 ] *は、空のString ""と一致します。 したがって、文字間のすべての「スペース」がパターンに一致します。 多くの ""を ""で置き換えるため、パフォーマンスにのみ注意が払われます。

これを試してください:

Pattern p = Pattern.compile("[,. ]*");
System.out.println(p.matcher("Hello World").replaceAll("$$$");

それは返す:

H $$$ e $$$ l $$$ o $$$$$$ W $$$ o $$$ r $$$ l $$$ d $$$!$$$

それを「手で」するのが遅いのも不思議ではありません! あなたは[、。 ] +





replace