java 正则表达式 matcher.replaceAll 与组

java regex matcher.replaceAll with groups

我正在尝试将一种语法替换为另一种语法,我正在通过正则表达式执行此操作,我想将一种模式替换为另一种模式。

Pattern pattern = Pattern.compile("length\((?<field>[a-zA-Z]+)\)", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(statement);

if (matcher.find())
           statement = matcher.replaceAll("LEN(" + matcher.group("field") + ")");
        return statement;

这是一件简单的事情,我想替换所有(循环)匹配项并将它们替换为另一个文本。但是我正在努力让小组也动态迭代。

Expected :select *,LEN(devise) lendevise,LEN(marche) lenmarche,LEN(nature) lennature from tableX where nseq='0'

Actual :select *,LEN(devise) lendevise,LEN(devise) lenmarche,LEN(devise) lennature from tableX where nseq='0'

所以你可以在这里注意到。组值总是替换为第一个匹配项的组,而不是被替换的相应匹配项?

有没有有效的"best"方法来做到这一点?我想避免(如果可能的话)将不同的组放在单独的数组中。

我建议将解决方案简化为单个 replaceAll 调用,这将替换内联的所有匹配项,并且不会像您遇到的那样造成任何麻烦:

statement = statement.replaceAll("length\(([a-zA-Z]+)\)", "LEN()");

参见regex and Java demo

String s = "select *,length(devise) lendevise,length(marche)  lenmarche,length(nature) lennature from tableX where nseq='0'";
System.out.println(s.replaceAll("length\(([a-zA-Z]+)\)", "LEN()"));
// => select *,LEN(devise) lendevise,LEN(marche) lenmarche,LEN(nature) lennature from tableX where nseq='0'

请注意,([a-zA-Z]+) 形成一个带编号的捕获组,稍后可以使用 占位符(或替换反向引用)访问其值。