javascript正则表达式与最后一组不匹配;从字符串中提取时间

时间:2018-02-22 22:41:33

标签: javascript regex

在比赛中

'meeting room 3 @ 5 am - 6 pm bob'
.match(/(@|at)?\s*?(\d+)\s*?(am|pm|AM|PM)?\s*?-\s*?(\d+)\s*?(am|pm|AM|PM)?/)

为什么最后pm不匹配?

结果为"["@ 5 am - 6","@","5","am","6",null]"

我希望nullpm

由于

1 个答案:

答案 0 :(得分:2)

让所有\s*?贪婪(特别是最后一个是罪魁祸首):

/(@|at)?\s*(\d+)\s*(am|pm|AM|PM)?\s*-\s*(\d+)\s*(am|pm|AM|PM)?/
                                               ^

请参阅regex demo

关键是(\d+)\s*?(am|pm|AM|PM)?匹配并使用(\d+)捕获一个或多个数字,然后正则表达式引擎尝试匹配(am|pm|AM|PM)?模式,而不是\s*?,因为{{ 1}}是一个懒惰量化的原子,因此首先被跳过。 \s*?模式可以匹配空字符串,它可以匹配。它匹配数字后面的空字符串,正则表达式引擎在一天内调用它返回有效匹配。