0

私はこのような文字列を持っています

final String text = "Some Text #AAAA some Other text .."(#大文字4文字)

Pattern patt = Patter.compile("(.*?)(#)([A-Z]{4})(.*?)");
patt.matcher(text ).replaceAll("$1$3$4")

テキスト内のAAAAのみ を小文字で削除#します。結果は期待されます:

いくつかのテキストaaaaいくつかの他のテキスト..

4つのAAAAの場合のみ、この結果は小文字になりますか?

4

5 に答える 5

5

replaceAll直接使用するのではなく、appendReplacement自分でループを実行する必要があります。より単純な正規表現を使用します。

Pattern patt = Patter.compile("#([A-Z]{4})");
Matcher mat = patt.matcher(text);
StringBuffer buf = new StringBuffer();
while(mat.find()) {
  mat.appendReplacement(buf, mat.group(1).toLowerCase());
}
mat.appendTail(buf);

通常、appendReplacement(とreplaceAll)で注意しMatcher.quoteReplacement、置換文字列に$記号や円記号が含まれている可能性がある場合は使用する必要がありますが、この場合、グループ1は常に正確に4文字になるため、これは発生しません。

于 2013-03-06T10:32:53.787 に答える
2

これはうまくいきます:

Matcher matcher = patt.matcher(text);
matcher.matches();
String res = matcher.group(1) + matcher.group(3).toLowerCase() + matcher.group(4);
于 2013-03-06T10:25:00.667 に答える
1

ここにワンライナーがあります:

String text2 = text.replaceFirst("(?<=#)[A-Z]{4}", text.replaceAll(".*?#([A-Z]{4}).*", "$1").toLowerCase());

あなたの例を見てください:

final String text = "Some Text #AAAA some Other text ..";
        String text2 = text.replaceFirst("(?<=#)[A-Z]{4}", text.replaceAll(".*?#([A-Z]{4}).*", "$1").toLowerCase());
        System.out.println(text2);

出力します:

Some Text #aaaa some Other text ..
于 2013-03-06T10:27:10.637 に答える
0

Matcher.replaceAll()APIページからの引用:

置換文字列内のバックスラッシュ ( \) とドル記号 ( $) は、リテラル置換文字列として扱われる場合とは結果が異なる場合があることに注意してください。ドル記号は、キャプチャされたサブシーケンスへの参照として扱われる場合があります。

これは、あなたが直面している問題とまったく同じように聞こえます...

于 2013-03-06T10:28:43.333 に答える