正则表达式捕获组的混乱

时间:2015-07-14 08:30:58

标签: java regex

我有以下文字

  

2015年7月31日 - 出发2站总行程时间:20小时40米   2015年8月26日 - 返回1站总行程时间:19小时0分钟芝加哥
  不间断

我希望得到文本之前的数字,看起来像"停止"以及" nonstop"的所有实例,但是我希望两者都在同一个捕获组中。

我写了这个正则表达式 (\d)(?:\Wstops?)|(nonstop)

这就是我想要的,但正如你所看到的那样,它包含两个捕获组(数字组#1和#3组#2;不间断'),这可以用一个捕获组完成吗?

我的另一个问题是,是否可以直接返回'直飞'使用正则表达式为0,而不是稍后处理代码中的文本?

以下是我的正则表达式的现场演示:regex101

1 个答案:

答案 0 :(得分:4)

您需要使用正lookahead assertion

Matcher m = Pattern.compile("\\d(?=\Wstops?)|nonstop").matcher(s);
while(m.find())
{
System.out.println(m.group());
}
  • \\d(?=\Wstops?)仅匹配所有数字,如果后面跟着非字字符,后跟字符串stopstops

  • |

  • nonstop匹配字符串nonstop