Input-> Input!RC + Calc!R[1]C[1]
在输出中我想对这些进行操作:
RC and R[1]C[1]
我的尝试:
private static void findMatch(String formula) { Matcher m = Pattern.compile("\\W(R(\\[(.+?)\\])?C(\\[(.+?)\\]))") .matcher(formula); // Matcher m = Pattern.compile( // "\\W(R(\\[(.+?)\\])?C) | \\W(R(\\[(.+?)\\])?C(\\[(.+?)\\]))") // .matcher(formula); for (; m.find(); m.reset(formula)) { System.out.println(m.group(3)); } }
它不会寻找第二个模式,也会进入无限循环。
这有什么不对吗?
答案 0 :(得分:4)
尝试以下方法:
String formula = "Input!RC + Calc!R[1]C[1]";
Matcher m = Pattern.compile("\\W(R(\\[(.+?)\\])?C(\\[(.+?)\\])?)").matcher(formula);
while (m.find()) {
System.out.println(m.group(1));
}
输出:
RC
R[1]C[1]
这里的主要变化是循环如何工作,我上面的内容是迭代模式匹配的典型方法。我也打印m.group(1)
而不是m.group(3)
,因为它是第一个包含整个匹配的组,除了!
,我认为这就是你想要的。
此处对正则表达式的唯一更改是在第二个?
组之后添加(\\[(.+?)\\])
以使其成为可选项。
答案 1 :(得分:1)
您希望此代码能做什么?
for (; m.find(); m.reset(formula)) {
System.out.println(m.group(3));
}
对于每个循环,它连续调用m.reset(公式),重置匹配器以使其从0开始,然后是m.find(),它查找字符串中的下一个匹配项。由于您之前调用了reset(),因此下一个匹配是第一个匹配。因此,你有一个无限循环。
如果要查找字符串中的所有匹配项,只需写:
while(m.find()) {
System.out.println(m.group(1));
}