16

Java API といくつかの一般的なサードパーティ ライブラリを調べましたが、StringBuilder を除いて、String.replaceAll が行うことを行う適切なメソッドを見つけることができません。

少し作業すれば StringBuffer で実行できることはわかっていますが、StringBuffer の方が遅いため、この道をたどりたくありません。

サードパーティのユーティリティを知っている人はいますか、またはこの機能を実装するための簡単なコードがあるかどうかは?

4

4 に答える 4

3

CharSequence正規表現は、内部でミュータブルを変更しません。正規表現は a を解析して aをCharSequence返します。 は結果です。は特別な処理があるため例外です。StringStringStringBufferStringBuilderCharSequence

代わりにできること:

// Class
private static final Pattern MY_PATTERN = Pattern.compile("my|regex");

{ // Method
    StringBuilder builder;
    // ...

    Matcher m = MY_PATTERN.matcher(builder);
    builder.replace(0, builder.length(), m.replaceAll("<b>$0</b>"));
}

テストコードのデモを見る!

于 2014-07-12T06:36:44.447 に答える
3

StringBuffer の方が遅いため、この道をたどりたくありません。

確かにそうですが、通常の時期尚早な最適化の注意事項があり、さらに重要なことに、最新の JVM は特定のケースでエスケープ分析を使用して StringBuffer/Vector/HashTable ロックを削除するため、最適化が行われると、パフォーマンスはほぼ同じになります。

于 2014-07-12T06:45:04.337 に答える
0

Apache Harmony Matcher のソース コードStringBuilder、現在使用されているStringBuffer. それに多くの依存関係を引きずっていないようです。ファイルの先頭にあるApacheライセンスは、商用プロジェクトでも悪くないかもしれません。

GNU Classpathコードも再利用できますが、ライセンスはより難しくなります (Matcher の変更されたバージョンを公開する必要がありますが、おそらくコードの残りの部分は必要ありません)。こちらの OpenJDK プロジェクトで見つけることができる元の Sun の実装についても同じです。

于 2013-06-28T14:45:30.287 に答える