我试图用“||”替换连接符号“+”在给定的多行脚本中,然而,java 正则表达式似乎只替换了 1 次出现,而不是全部。
String ss="A+B+C+D";
Matcher mm=Pattern.compile("(?imc)(.+)\\s*\\+\\s*(.+)").matcher(ss);
while(mm.find())
{
System.out.println(mm.group(1));
System.out.println(mm.group(2));
ss=mm.replaceAll("$1 \\|\\| $2");
}
System.out.println(ss); // Output: A+B+C||D, Expected: A||B||C||D
最佳答案
您只替换一个元素的原因是因为您匹配整行。您使用的正则表达式 "(?imc)(.+)\\s*\\+\\s*(.+)"
,匹配任何内容 (.+)
直到结束,然后恢复,所以它可以匹配其余的 \\s*\\+...
。所以基本上你的组 1 是 .+ 几乎所有的东西,但最后一个 + 和以后。因此 replaceAll 只能匹配一次,并会在该次替换后终止。
您需要的是找到 +
可选地包含在空格中的替换:
Pattern.compile("(?imc)\\s*\\+\\s*");
这应该匹配所有你想匹配的,而不是匹配整行,而只是匹配你的替换字符。
关于Java RegEx 不会替换所有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56697557/