Java正则表达匹配不匹配OR'd单词集,剩余工作正常

时间:2016-01-17 20:04:29

标签: java regex

我正在尝试编写一个正则表达式来标记以下字符串,

turn on 931,331 through 939,812
turn off 756,53 through 923,339
toggle 756,965 through 812,992

这是我的正则表达式,

Pattern pattern = Pattern.compile("[(turn on)|(turn off)|(toggle)] (\\d+),(\\d+) through (\\d+),(\\d+)");


for (String word : lines) {
        Matcher m = pattern.matcher(word);
        if (m.find()) {
            System.out.println(m.group(0));
        }
    }

返回以下结果

n 931,331 through 939,812
f 756,53 through 923,339
e 756,965 through 812,992

我的正则表达式组1到4返回我匹配的4个数字但由于某种原因我无法捕获字符串“打开”或“关闭”或“切换”到组1中,然后是他们自己小组中的数字?

如果我使用以下正则表达式,

Pattern pattern = Pattern.compile("(turn on) (\\d+),(\\d+) through (\\d+),(\\d+)");

我可以在第1组中捕获“开启”,然后在其自己的组中捕获每个数字。但是我必须为“关闭”和“切换”构建另一个模式对象

我出错了什么?

我也尝试过这种变化,

Pattern pattern = Pattern.compile("([turn on|turn off|toggle]) (\\d+),(\\d+) through (\\d+),(\\d+)");

1 个答案:

答案 0 :(得分:1)

您正在尝试使用character set对捕获组进行分组(这将与括号中的一个字符匹配),这就是为什么在您的情况下只匹配一个字符的原因。

如果要对捕获组进行分组,则可以改为使用非捕获组:

(?:(turn on)|(turn off)|(toggle)) (\\d+),(\\d+) through (\\d+),(\\d+)

但这没有必要,因为你可以使用以下内容:

(turn on|turn off|toggle) (\\d+),(\\d+) through (\\d+),(\\d+)