在比赛中
'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]"
我希望null
为pm
由于
答案 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*?
模式可以匹配空字符串,它可以匹配。它匹配数字后面的空字符串,正则表达式引擎在一天内调用它返回有效匹配。