java正则表达式matcher.replaceAll与组

时间:2018-12-05 11:20:25

标签: java regex matcher

我正尝试用另一种语法替换一种语法,而我正在通过正则表达式来做到这一点,我想用一种模式替换另一种语法。

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;

这是一件简单的事情,我想替换所有(循环遍历)所有匹配项,然后将其替换为另一个文本。但是,我在努力让组动态地迭代。

  

预期:从tableX中选择*,LEN(devise)lendevise,LEN(marche)lenmarche,LEN(nature)lennature,其中nseq ='0'

     

实际:从tableX中选择*,LEN(devise)lendevise,LEN(devise)lenmarche,LEN(devise)lennature,其中nseq ='0'

因此您在这里可以注意到。组值总是被第一个匹配项的组替换,而不是被替换的各个匹配项?

是否有一种有效的“最佳”方法?我想避免(如果可能的话)将不同的组放在单独的数组中。

1 个答案:

答案 0 :(得分:1)

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

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

请参见regexJava 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($1)"));
// => select *,LEN(devise) lendevise,LEN(marche) lenmarche,LEN(nature) lennature from tableX where nseq='0'

请注意,([a-zA-Z]+)构成了一个编号捕获组,其后面将通过使用$1占位符(或替换后向引用)来访问其值。