比赛中
'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
谢谢
最佳答案
让所有的 \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+)
匹配并捕获 1 个或多个数字>,那么正则表达式引擎会尝试匹配 (am|pm|AM|PM)?
模式,而不是 \s*?
,因为 \s*?
是一个延迟量化的原子,因此首先被跳过。 (am|pm|AM|PM)?
模式可以匹配一个空字符串,它确实如此。它匹配紧跟在数字之后的空字符串,正则表达式引擎称它为返回有效匹配的一天。
关于javascript 正则表达式与最后一组不匹配;从字符串中提取时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48938419/