我正在尝试编写一个正则表达式来标记以下字符串,
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+)");
答案 0 :(得分:1)
您正在尝试使用character set对捕获组进行分组(这将与括号中的一个字符匹配),这就是为什么在您的情况下只匹配一个字符的原因。
如果要对捕获组进行分组,则可以改为使用非捕获组:
(?:(turn on)|(turn off)|(toggle)) (\\d+),(\\d+) through (\\d+),(\\d+)
但这没有必要,因为你可以使用以下内容:
(turn on|turn off|toggle) (\\d+),(\\d+) through (\\d+),(\\d+)