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()");
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]+)
形成一个带编号的捕获组,稍后可以使用
占位符(或替换反向引用)访问其值。
我正在尝试将一种语法替换为另一种语法,我正在通过正则表达式执行此操作,我想将一种模式替换为另一种模式。
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()");
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]+)
形成一个带编号的捕获组,稍后可以使用 占位符(或替换反向引用)访问其值。