正则表达式无需括号如何绑定冒号与相邻语句 解决时间匹配误匹配问题
问题根源
你写的正则中两个分隔符:都被标记为独立可选,所以即使没有对应的分钟/秒,单独的冒号也能匹配成功,就会出现6::pm这类非法内容通过校验的问题。
解决方案
把分隔符和对应的时间部分绑定为一个整体可选块,用非捕获组(?:)包裹(避免额外占用分组位置),保证冒号只要出现,后面必然跟着两位有效数字,最终正则如下:
^([1-9]|1[0-2])(?::([0-5][0-9]))?(?::([0-5][0-9]))?(am|pm)$
规则说明
- 第一捕获组
([1-9]|1[0-2])匹配1-12的有效小时,必填 (?::([0-5][0-9]))?为可选的分钟块:要么完全不出现,要么同时出现:加两位00-59的分钟,分钟值捕获到第二组,未匹配时返回None(?::([0-5][0-9]))?为可选的秒块:逻辑同分钟,秒值捕获到第三组,未匹配时返回None- 第四捕获组
(am|pm)匹配上下午标识,必填
校验效果
- 合法通过:
6pm、12:30am、9:05:59pm,分组返回结果符合你的要求 - 非法拦截:
6::pm、0:20am、6:5pm、13:00pm均无法匹配
内容的提问来源于stack exchange,提问作者QWYH
相关产品推荐
相关产品推荐

