是否有一种方法可以使用“或”语句对正则表达式进行分组?

时间:2015-05-15 22:39:39

标签: java regex

我阅读了关于正则表达式的this教程。我尝试使用|(或)组。 (用括号()标记),如下:

add (\\d+) to (\\d+)|(\\d+) plus (\\d+)

匹配文本为“添加5到6”或“5加6”的示例。

但是,第二个选项“5加6”使用第3组和第4组,因为它是同一模式的一部分。 如果第二个选项匹配,是否可以“排除”之前的组?

代码证明了这个问题:

package example.regex.tester;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SmartMath {

    public static void main(String[] args) {

        String textToMatch = "5 + 6";

        Pattern add = Pattern.compile("add (\\d+) to (\\d+)|(\\d+) plus (\\d+)");

        Matcher additionMatcher = add.matcher(query);

        if (additionMatcher.matches() == true) {
            int a = Integer.parseInt(additionMatcher.group(1)); // Does not work because groups are numbered as 3 and 4 when "5 plus 6" is used.
            int b = Integer.parseInt(additionMatcher.group(2));

            System.out.println(a + b);

        }

        else {
            System.out.println("Text does not match.");
        }

    }

}

1 个答案:

答案 0 :(得分:2)

您只能使用named capturing groups在.NET中执行此操作,而不能在Java中执行此操作。

您需要重新编写正则表达式,以便它只有2个组。 E.g。

(?:add )?(\\d+) (?:to|plus) (\\d+)

(?:add )?是可选的,然后我们匹配一个空格,然后匹配一个或多个数字,然后是“to”或“plus”,然后是空格,再次是1位或更多位数。