生活资讯
日期正则表达式 、日期正则表达式格式
2023-04-19 00:51  浏览:29

正则表达式 日期

最简单的正则 如 : \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-)))

日期正则表达式的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于日期正则表达式格式、日期正则表达式的信息别忘了在本站进行查找喔。

发表评论
0评