日期正则表达式(包括闰年的计算)

分析: 
        中国式日期为“年-月-日” 
        年:1到任意在于1的整数,不能“0”开头。 
        月:1到12。 
        日:1、3、5、7、8、10、12月有31天;4、6、9、11月有30天,闰年2月份有29天,否则28天。 
        闰年的条件是符合下面二者之一: 
                (1)能被4整除,但不能被100整除。 
                (2)能被4整除,又能被400整除。//缩写为能被400整除。 
        #00格式(#代表任何数),只要#能被4整除,#00就一定能被400整除(闰年)。 
        非#00格式(也就不能被100整除了),能被4整除。 
第一年的2月份都有28天,只要是闰年还要加一天。现在的任务是找出闰年。 
100以内能被4整除的有: 
00 04 08 12 16 
20 24 28 32 36 
40 44 48 52 56 
60 64 68 72 76 
80 84 88 92 96 
他们的表达式为:(0?[048]|[2468][048]|[13579][26]) 

#00一定会被4整除,所以,只要#能被4整除,#00就一定能被400整除,他就是闰年。 
#00格式闰年:(\d*(0?[048]|[2468][048]|[13579][26])00) 
因为不能为#00格式,所以要从上面的表中删除00这个结果。 
非#00格式闰年:(\d*(0?[48]|[2468][048]|[13579][26])) 
把上面两个正则表达式合并 
闰年:(\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26])) 

整数01-28:(2[0-8]|[01]\d) 
整数01-30:(30|[012]\d) 
整数01-31:(3[01]|[012]\d) 

整数1-28:(2[0-8]|1\d|[1-9]) 
整数1-30:(30|[12]\d|[1-9]) 
整数1-31:(3[01]|[12]\d|[1-9]) 
把上面两组格式合并在一起: 
整数1-28:(2[0-8]|1\d|0?[1-9]) 
整数1-30:(30|[12]\d|0?[1-9]) 
整数1-31:(3[01]|[12]\d|0?[1-9]) 

现在我们把它们全部组合成中国“年-月-日”格式 
^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))-0?2-29)$|^[1-9]\d*-((0?[13578]|10|12)-(3[01]|[12]\d|0?[1-9])|(0?[469]|11)-(30|[12]\d|0?[1-9])|(0?2)-(2[0-8]|1\d|0?[1-9]))$ 

匹配: 
1-1-1 
244-02-29 
10-10-10 
2000-2-29 
2008-2-29 
不匹配: 
2009-2-29 
2009-13-10 
1005-12-65 

中国“年/月/日”格式 
^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))\/0?2\/29)$|^[1-9]\d*\/((0?[13578]|10|12)\/(3[01]|[12]\d|0?[1-9])|(0?[469]|11)\/(30|[12]\d|0?[1-9])|(0?2)\/(2[0-8]|1\d|0?[1-9]))$ 
匹配: 
1/1/1 
244/02/29 
10/10/10 
2000/2/29 
2008/2/23 
不匹配: 
2009/2/29 
2009/13/10 
1005/12/65 


中国“年.月.日”格式 
^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))\.0?2\.29)$|^[1-9]\d*\.((0?[13578]|10|12)\.(3[01]|[12]\d|0?[1-9])|(0?[469]|11)\.(30|[12]\d|0?[1-9])|(0?2)\.(2[0-8]|1\d|0?[1-9]))$ 
匹配: 
1.1.1 
244.02.29 
10.10.10 
2000.2.29 
2008.2.23 
不匹配: 
2009.2.29 
2009.13.10 
1005/12/65 

中国“年/月/日”、“年-月-日”、“年.月.日”格式 
(^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))-0?2-29)$|^[1-9]\d*-((0?[13578]|10|12)-(3[01]|[12]\d|0?[1-9])|(0?[469]|11)-(30|[12]\d|0?[1-9])|(0?2)-(2[0-8]|1\d|0?[1-9]))$)|(^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))\/0?2\/29)$|^[1-9]\d*\/((0?[13578]|10|12)\/(3[01]|[12]\d|0?[1-9])|(0?[469]|11)\/(30|[12]\d|0?[1-9])|(0?2)\/(2[0-8]|1\d|0?[1-9]))$)|(^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))\.0?2\.29)$|^[1-9]\d*\.((0?[13578]|10|12)\.(3[01]|[12]\d|0?[1-9])|(0?[469]|11)\.(30|[12]\d|0?[1-9])|(0?2)\.(2[0-8]|1\d|0?[1-9]))$) 
匹配: 
1/1/1 
244/02/29 
10/10/10 
2000/2/29 
2008/2/29 
244-02-29 
10-10-10 
2000-2-28 
2008.2.29 
不匹配: 
1-1/1 
2009/2/29 
2009/13/10 
1005/12/65 
2009-2-29 
2009-13-10 
1005-12-65 

中国“年月日”格式(用于身份证编码等),年由4位数表示,月2位,日2位 
^(((0[048]|[2468][048]|[13579][26])00|\d\d(0[48]|[2468][048]|[13579][26]))0229)$|^\d{4}((0[13578]|10|12)(3[01]|[12]\d|0[1-9])|(0[469]|11)(30|[12]\d|0[1-9])|02(2[0-8]|1\d|0[1-9]))$ 
匹配: 
19880329 
20001220 
20080229 
不匹配: 
1988329 
20090229 
20091310 
10051265 

欧美“月/日/年”格式 
^(0?2\/29\/(\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26])))$|^((0?[13578]|10|12)\/(3[01]|[12]\d|0?[1-9])|(0?[469]|11)\/(30|[12]\d|0?[1-9])|(0?2)\/(2[0-8]|1\d|0?[1-9]))\/[1-9]\d*$ 
匹配: 
1/1/1 
02/29/244 
10/10/10 
02/29/2000 
2/29/2008 
不匹配: 
2/29/2009 
13/10/2009 

12/65/1005 


转载自:http://dangjunli.iteye.com/blog/422985

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值