日期正则表达式(转)
简单
正则
: \d{4}-\d{2}-\d{2}
实际情况却


简单,,要考虑,有效性和闰年等问题.....
对于日期
有效范围
同
应用场景会有所
同
MSDN
定义
DateTime对象
有效范围
:0001-01-01 00:00:00
9999-12-31 23:59:59
UNIX时间戳
0按照ISO 8601规范
:1970-01-01T00:00:00Z
先考虑与年份无关
前三条规则
年份
统
写作
(?!0000)[0-9]{4}
下面仅考虑月和日
正则
1. 包括平年
内
所有年份
月份都包含1-28日
(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])
2. 包括平年
内
所有年份除2月外都包含29和30日
(0[13-9]|1[0-2])-(29|30)
3. 包括平年
内
所有年份1、3、5、7、8、10、12月都包含31日
(0[13578]|1[02])-31)
合起来
除闰年
2月29日外
其
所有日期
(?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)
接下来考虑闰年
实现
1 : 四年
闰
([0-9]{2}(0[48]|[2468][048]|[13579][26])
2 : 百年
闰
四百年再闰
(0[48]|[2468][048]|[13579][26])00
3 : 合起来
所有闰年
2月29日
([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)
四条规则都已实现
且互相间没有影响
合起来
所有符合DateTime范围
日期
正则
^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$
考虑

正则表达式仅仅
用作验证
所
捕获组没有意义
只会占用资源
影响匹配效率
所

使用非捕获组来进行优化
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
浙公网安备 33010602011771号