日期的正则表达式

2 篇文章 0 订阅
 

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值