匹配M/DD/YY Time格式日期的正则表达式问题求助
正则表达式匹配"M/DD/YY Time"格式问题解决
问题核心
你需要匹配M/DD/YY Time格式的日期(示例:3/21/22 6:00 AM),但现有正则无法匹配开头的月份"3",本质是月份部分的正则逻辑混乱,同时你对|分支运算符、1\d/2\d的作用存在误解。
先拆解你疑问的知识点
1. |(或运算符)的作用
|代表分支选择,正则引擎会从左到右依次尝试每个分支,只要某一个分支匹配成功,就会停止后续分支的匹配。比如a|b会匹配字符串中的"a"或者"b"。
2. 1\d、2\d的工作逻辑
1\d:匹配以"1"开头的任意一位数字,也就是10-19范围内的数2\d:匹配以"2"开头的任意一位数字,也就是20-29范围内的数
但你把这两个规则放到月份匹配里完全错误——月份范围是1-12,根本不需要匹配10-29的数值。
现有正则的问题
你写的月份部分:((0?[1-9]|1[012])|\d|1\d|2\d|3[01])
这里的问题非常明显:
- 第一个分支
(0?[1-9]|1[012])其实已经正确覆盖了所有合法月份:01-09或1-9(0?[1-9])、10-12(1[012]) - 后面追加的
|\d|1\d|2\d|3[01]都是多余且冲突的分支:\d会匹配0-9的任意数字(包括0,这是非法月份),1\d/2\d匹配的是10-29(超出月份范围),3[01]是日期的合法值(30/31),完全不该出现在月份规则里。这些冗余分支会干扰正则引擎的匹配逻辑,导致合法月份无法被正确捕获。
修正后的正则
针对M/DD/YY Time格式,正确的正则表达式如下:
^(0?[1-9]|1[012])\/(0?[1-9]|[12]\d|3[01])\/(\d{2}) ([01]?\d|1[0-2]):[0-5]\d ([AaPp][Mm])$
逐部分解释
- 月份:
0?[1-9]|1[012]0?[1-9]:匹配1-9,允许带前导0(比如3或03)1[012]:匹配10、11、12
- 日期:
0?[1-9]|[12]\d|3[01]0?[1-9]:匹配1-9,允许带前导0[12]\d:匹配10-293[01]:匹配30、31
- 年份:
\d{2}:匹配任意两位数字(比如22) - 小时:
[01]?\d|1[0-2][01]?\d:匹配0-19的数,允许带前导0(比如6或06)1[0-2]:匹配10、11、12(符合12小时制规则)
- 分钟:
[0-5]\d:匹配00-59的合法分钟值 - AM/PM:
[AaPp][Mm]:不区分大小写匹配AM或PM
验证测试
对于你的测试用例3/21/22 6:00 AM,修正后的正则可以完美匹配:
- 月份
3匹配0?[1-9] - 日期
21匹配[12]\d - 年份
22匹配\d{2} - 小时
6匹配[01]?\d - 分钟
00匹配[0-5]\d AM匹配[AaPp][Mm]
内容的提问来源于stack exchange,提问作者Michał Mańkowski
相关产品推荐
相关产品推荐

