通过正则表达式迭代找到

时间:2013-02-14 00:28:48

标签: java regex

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));
        }

    }

它不会寻找第二个模式,也会进入无限循环。

这有什么不对吗?

2 个答案:

答案 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));
}