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

标签 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

谢谢

最佳答案

让所有的 \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/

相关文章:

javascript - 防止angularjs应用程序中的重定向行为

javascript - 如何将 YouTube API 持续时间(格式为 PT#M#S 的 ISO 8601 持续时间)转换为秒

python - django url 中的正则表达式错误

javascript - 带连字符的 YouTube 网址测试器

javascript - 检查两个字符串的顺序是否相同

javascript - 输入数字部分功能仅有效一次

javascript - 无法在 Javascript 中将数组按升序排序

c# - 如何在 .NET 中使用 Regex 获取页面元数据(标题、描述、图像),如 facebook 附加 url

javascript - 使用简单的正则表达式验证浏览器上传文件名和扩展名

javascript - 我应该如何将 Svelte Reactivity 与 DOM getElementById 一起使用?