节点JS RegEx非捕获组不按预期工作

时间:2014-07-02 14:25:56

标签: javascript regex

给定一个字符串"14:00-18:00"我希望得到它的开始和结束时间。

我的代码如下所示:

var startTime = hourRange.match(/([0-9]{2}\:[0-9]{2})(?:\-)/);
var endTime = hourRange.match(/(?:\-)([0-9]{2}\:[0-9]{2})/);

在像Regex101这样的东西上分别返回14:00和18:00。但在Javascript中,第一个返回['14:00-', '14:00'],第二个返回['-18:00', '18:00']

我做错了什么?

1 个答案:

答案 0 :(得分:1)

我认为关于匹配捕获之间的区别可能存在一些混淆,所以要澄清:正则表达式匹配一个(只有一个,没有{ {1}}修饰符)字符串的一部分。在这个匹配中,它可以捕获多个子串。

您的输出是预期的行为,因为match函数返回一个如下组成的数组:

  • 第一个元素是整场比赛 g 匹配 ([0-9]{2}:[0-9]{2})-,以便第一项是什么。

  • 以下项目是捕获组,按照正则表达式中的左括号的显示顺序。
    14:00- 在第一个捕获组中捕获 ([0-9]{2}:[0-9]{2})-,这样该数组的第二项将是什么。

如果在14:00上使用(\d{2}:\d{2})-(\d{2}:\d{2}),则整体匹配(结果数组中的第一项)是整个字符串,实际时间在第1组和第2组中捕获。开始时间和结束时间是结果数组的第二个和第三个元素。

所以从一般意义上讲,如果你只关心捕获组的值,你可以扔掉索引14:00-18:00的元素,它始终是整体匹配。

希望能回答你的问题。