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#的in文本 ,预期结果:

一些文字aaaa一些其他文字..

这个结果如何以小写形式出现,仅适用于四个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(and replaceAll) 并使用,但在这种情况下,我们知道这不会发生,因为第 1 组总是正好是四个字母。Matcher.quoteReplacement$

于 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 回答
1

试试这个 :

public static void main (String args[]) {
    String matched = "";
    Pattern pattern = Pattern.compile("(.*?)(#)([A-Z]{4})(.*?)");
    Matcher matcher = pattern.matcher("Some Text #AAAA some Other text");
    if (matcher.find()) {   
        matched =  matcher.group(1) + matcher.group(3).toLowerCase() + matcher.group(4);
    }
    System.out.println(matched);
}
于 2013-03-06T10:31:44.127 回答
0

Matcher.replaceAll()API 页面引用:

请注意,替换字符串中的反斜杠 ( \) 和美元符号 ( $) 可能会导致结果与将其视为文字替换字符串时的结果不同。美元符号可以被视为对捕获的子序列的引用。

这听起来就像你面临的问题......

于 2013-03-06T10:28:43.333 回答