2013-06-28 3 views
13

Java APIといくつかの一般的なサードパーティライブラリを調べましたが、StringBuilderを除いて、String.replaceAllの機能を実行する適切なメソッドを見つけることができません。StringBuilderのreplaceAllと正規表現のサポートはどちらですか?

少しの作業で、StringBufferのために行うことができますが、StringBufferの処理速度が遅いため、この道を踏み出すことは望ましくありません。

サードパーティ製のユーティリティを知っている人はいますか?また、この機能を実装するための簡単なコードがあれば教えてください。

+0

文字列に変換して置き換え(必要に応じて変換)することは重要ではありませんか? – Dukeling

+1

'Matcher'(任意の' CharSequence'で作成できます)を作成し、 'appendReplacement'と' appendTail'を使って独自の 'replaceAll'を書くループを書くことができます。 –

+0

はい、しかし、それはStringBufferを使用しています... – h22

答えて

0

Apache Harmony Matcher source codeは、現在使用されているStringBufferの代わりにStringBuilderと完全に再利用可能なようですが、別のパッケージに移動してください。それはそれに多くの依存を引きずっていないようです。ファイルの先頭にあるApacheライセンスは、商用プロジェクトであっても悪くないかもしれません。

GNU Classpathコードを再利用することもできますが、ライセンスはより難しくなります(変更したバージョンのMatcherを公開する必要がありますが、残りのコードは公開しないでください)。 OpenJDKプロジェクトでhereというオリジナルのSunの実装と同じです。

3

String.replaceAllは、Matcher.replaceAllの単なる便利な方法です。 Matcherは、Javaで正規表現を使用する「実際の」方法であり、さらに洗練された使用例が可能です。

また、Stringの正規表現メソッドで実行できるものは、Matcherの同様のメソッドで行うことができます。 Matcher sは任意CharSequenceStringBuilderStringBufferStringCharBufferによって実装されるインターフェース)のために得ることができる。美しさは、単にString S以上でそのMatcherの仕事です。だからあなたは簡単にすることができます:

import java.util.regex.*; 

... 

StringBuilder sb = new StringBuilder(); 
sb.append("This works with StringBuffers"); 
Pattern p = Pattern.compile("\\Buffer\\B"); 
Matcher m = p.matcher(sb); 
System.out.println(m.replaceAll("uilder")); 

出力されますThis works with StringBuilders

Working demo.

+0

'm.relaceAll'はStringBufferを内部的に使用し、置き換えられたデータでStringを返すので、OPがこのようなものであるかどうかはわかりません。 OPは、Matcher#appendReplacement()で使用しているように、StringBufferの代わりにStringBuilderを使用する方法があることを知りたいと思っていますが、間違っている可能性があります。 OPのコメントはここで良いでしょう。 – Pshemo

+0

@Pshemoああ、私はMatcherがStringBufferを内部的に使っていることは知らなかった。 –

+3

私は基本的に次のメソッドシグネチャを持っています: 'public void replaceAll(final StringBuilder builder、final String regex、final String replacement)'ビルダーのデータは、再割り当てを行うことなく変更する必要があります。 –

0

正規表現は、内部的に変更可能なCharSequenceを変更しません。 RegexはStringを返すようにCharSequenceを解析します。この場合、Stringが結果になります。 StringBufferは特別な処理があるため例外です。StringBuilderCharSequenceの場合は、一致結果で修正する必要があります。あなたの代わりに何ができるか

// 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>")); 
} 

View a test code demo!

関連する問題