8
输入-> 输入!RC + 计算!R[1]C[1]

在输出中我想对这些进行操作:

RC 和 R[1]C[1]

我的尝试:

私人静态无效findMatch(字符串公式){
         匹配器 m = Pattern.compile("\\W(R(\\[(.+?)\\])?C(\\[(.+?)\\]))")
         .matcher(公式);
        // 匹配器 m = Pattern.compile(
        // "\\W(R(\\[(.+?)\\])?C) | \\W(R(\\[(.+?)\\])?C(\\[( .+?)\\]))")
        // .matcher(公式);
        for (; m.find(); m.reset(公式)) {
            System.out.println(m.group(3));
        }

    }

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

这有什么问题?

4

2 回答 2

7

尝试以下操作:

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)因为它是第一个包含整个匹配项的组,除了!,我认为这是你想要的。

此处对正则表达式的唯一更改是?在第二(\\[(.+?)\\])组之后添加以使其可选。

于 2013-02-14T00:39:58.870 回答
3

如果你看这段代码:

for (; m.find(); m.reset(formula)) {
    System.out.println(m.group(3));
}

对于每个循环,它会依次调用m.reset(formula),重置匹配器,使其从 0 开始,然后m.find(),它会在字符串中查找下一个匹配项。既然你reset()之前打过电话,下一场比赛就是第一场比赛。因此,您有一个无限循环。

如果要查找字符串中的所有匹配项,只需编写:

while(m.find()) {
    System.out.println(m.group(1));
}
于 2013-02-14T00:40:04.843 回答