regex 模式.matcher(s).replaceAll(“$1$2$3”)仅将$2转换为小写

mfuanj7w  于 2022-12-14  发布在  其他
关注(0)|答案(5)|浏览(142)

我有一个这样的字符串
final String text =“一些文本#AAAA一些其他文本..”(#带有4个大写字母)

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

仅删除 text 中的#
我会输入小写的 AAAA,预期结果为:
一些文本 aaaa 一些其他文本..
这个结果怎么会用小写,只为四个 AAAA

ui7jx7zq

ui7jx7zq1#

您将不得不自己执行appendReplacement循环,而不是直接使用replaceAll。我将使用一个更简单的正则表达式:

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

通常你必须注意appendReplacement(和replaceAll),如果替换字符串可能包含$符号或反斜杠,则使用Matcher.quoteReplacement,但在这种情况下,我们知道这不可能发生,因为组1总是正好四个字母。

rn0zuynd

rn0zuynd2#

这将起作用:

Matcher matcher = patt.matcher(text);
matcher.matches();
String res = matcher.group(1) + matcher.group(3).toLowerCase() + matcher.group(4);
a0zr77ik

a0zr77ik3#

这里有一条线:

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 ..
uwopmtnx

uwopmtnx4#

试试这个:

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);
}
piwo6bdm

piwo6bdm5#

引用Matcher.replaceAll() API页面中的内容:
请注意,替换字符串中的反斜杠(\)和美元符号($)可能导致结果与将其视为文字替换字符串时的结果不同。美元符号可能被视为对捕获的子序列的引用。
这听起来就像你面临的问题...

相关问题