正则表达式 日期
最简单的正则 如 : \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)$
参考资料:a href=" " target="_blank" ;/a
日期的正则表达式解释
您好,((^((1[8-9]d{2})|([2-9]d{3}))([-/._])
(10|12|0?[13578])([-/._])(3[01]|[12][0-9]
|0?[1-9])$)|(^((1[8-9]d{2})|([2-9]d{3}))
([-/._])(11|0?[469])([-/._])(30|[12][0-9]
|0?[1-9])$)|(^((1[8-9]d{2})|([2-9]d{3}))
([-/._])(0?2)([-/._])(2[0-8]|1[0-9]|0?[1-
9])$)|(^([2468][048]00)([-/._])(0?2)([-/
._])(29)$)|(^([3579][26]00)([-/._])(0?2)
([-/._])(29)$)|(^([1][89][0][48])([-/._])
(0?2)([-/._])(29)$)|(^([2-9][0-9][0][48])
([-/._])(0?2)([-/._])(29)$)|(^([1][89]
[2468][048])([-/._])(0?2)([-/._])(29)$)|
(^([2-9][0-9][2468][048])([-/._])(0?2)([-/
._])(29)$)|(^([1][89][13579][26])([-/._])
(0?2)([-/._])(29)$)|(^([2-9][0-9][13579]
[26])([-/._])(0?2)([-/._])(29)$))
闰年的2月份有29天,因此匹配闰年日期格式为
YYYY-MM-DD的正则表达式为:
(([0-9]{2})(0[48]|[2468][048]|[13579][26])
|((0[48]|[2468][048]|[3579][26])00))-02-29
最后,将平年和闰年的日期验证表达式合并,
我们得到最终的验证日期格式为YYYY-MM-DD
的正则表达式为:
(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]
{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]
|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]
|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1]
[0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468]
[048]|[13579][26])|((0[48]|[2468][048]|
[3579][26])00))-02-29)
DD/MM/YYYY格式的正则验证表达式为:
(((0[1-9]|[12][0-9]|3[01])/((0[13578]|1
[02]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|
(0[1-9]|[1][0-9]|2[0-8])/(02))/([0-9]{3}[1-
9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]
{2}|[1-9][0-9]{3}))|(29/02/(([0-9]{2})(0
[48]|[2468][048]|[13579][26])|((0[48]|
[2468][048]|[3579][26])00)))
表示年月的正则表达式
我们知道月份通常是两个数字从01-12;所以月份可以采用|这个运算符来解决。当***个数字式0的时候,第二个数字就可以从1-9,当***个数字式1的时候,第二个数字就只能从0-2。于是月份的正则表达式可以设计为:var
remonth=/0[1-9]|1[0-2]/;对于年份的正则表达式,我们同样也可以用|这个运算符来解决,考虑从1900-2099这个范围的日期(当然你可以根据需要,任意设定,原理一样),则可以设计年份正则表达式如下:var
reyear=/19|20d{2}/;于是年月正则表达式就可以设计如下:var
yearmonth=/(?:19|20d{2})-(?:0[1-9]|1[0-2})/;(其中?:是一个非捕获性标志)
日期正则表达式怎样写
匹配1600-2999年yyyy或yyyy-mm或yyyy-mm-dd ,基本上把闰年和2月等的情况都考虑进去了:
((1[6-9]|[2-9]d)d{2})|(((((1[6-9]|[2-9]d)d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]d|3[01]))|(((1[6-9]|[2-9]d)d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]d|30))|(((1[6-9]|[2-9]d)d{2})-0?2-(0?[1-9]|1d|2[0-8]))|(((1[6-9]|[2-9]d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)))
日期正则表达式的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于日期正则表达式格式、日期正则表达式的信息别忘了在本站进行查找喔。