完整日期正则表达式
正则表达式 日期匹配 闰年平年
需要对日期进行一个正则表达式匹配,想要找出一个能够匹配所有情况的正则表达式。
网上这篇博客【http://www.cnblogs.com/jay-xu33/archive/2009/01/08/1371953.html
】说得挺不错的,大家可以借鉴参考。
1.年份分析
1.1 年份的相关概念
年份主要是有平年和闰年之别,平年有365天,闰年有366天。
为什么平年有365天和闰年有366天,而不是其他数字?
(1)首先,地球绕太阳公转一周的时间长度称为【一回归年】。一回归年换算成时间长度就是365天5时48分46秒,即365.02422天。为了方便,就取整数365天作为平年的天数。这里就说明了数字【365】的来源。
(2)平年一年有365日,比一回归年短0.2422日,四年共短0.9688日(约等于1),所以每4年增加1日,这一年有366日,就是闰年这里就解释了数字【366】的来源。
(3)闰年定义:上面说到每4年增加1日,这年有366天就是闰年。但每4年增加1日,这样年份天数比4个回归年又多0.0312日,400年后将多3.12日,故在400年中少设3个闰年,也就是在400年中只设97个闰年(如果按照原来每4年就有一个闰年的计算方式,则400年就有100个闰年),这样公历年的平均长度与回归年就相近似了。由此规定:年份是整百数的必须是400的倍数才是闰年,例如1300年不是闰年,1200年是闰年。
由此可知,4个年份数字(yyyy)满足【能被400整除】或【被4整除且不能被100整除】两个条件之一的,那一年就是闰年。其他年份就是平年。
1.2 年份的数字表示
常见的合法日期时间在一个有效范围内,这里我们取【0001年01月01日 00时00分00秒】到【9999年12月31日 23时59分59秒】。
(1)所有年份是从0001到9999,要注意不能出现四个数字同时为0的情况,即不能出现0000年,这是非法的年份数字。一个数字可以用\d或[0-9]表示。
所有年份正则表达式:
[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}
(2)闰年
根据闰年的定义将闰年分为两类:
- 能被4整除但不能被100整除的年份。
根据年份最后两位数字的变化规律,得到下面的正则匹配式子:
([0-9]{2})(0[48]|[2468][048]|[13579][26])
- 能被400整除的年份。
能被400整除的数最后两位肯定是00,我们只要保证前两位能被4整除即可,相应的正则表达式为:
(0[48]|[2468][048]|[13579][26])00
2.日期分析
日期主要就是每个月的天数不同,比较特殊的就是2月,平年2月28天,闰年2月有29天。其他月份在平年和闰年没有区别。
(1)月份为 1, 3, 5, 7, 8, 10, 12,天数范围为 01 - 31,正则表达式为:
(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])
(2)月份为 4, 6, 9, 11,天数范围为 01-30,正则表达式为:
(0[469]|11)-(0[1-9]|[12][0-9]|30)
(3)月份为 2,平年时的正则表达式为:
02-(0[1-9]|[1][0-9]|2[0-8])
闰年时只要特地匹配29日那天即可,因为其他的日子都可以在平年的表达式里面匹配到,故为:
02-29
3.完整的年月日正则表达式
^((([0-9]{2})(0[48]|[2468][048]|[13579][26])) #闰年,能被4整除但不能被100整除
|((0[48]|[2468][048]|[13579][26])00) #闰年,能被400整除
-02-29) #匹配闰年2月29日这一天。如果不是这一天,则由下面式子继续匹配验证。
|([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}) #平年(0001-9999)
-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])) #月日,1、3、5、7、8、10、12月有31天
|((0[469]|11)-(0[1-9]|[12][0-9]|30)) #月日,4、6、9、11月有30天
|(02-(0[1-9]|[1][0-9]|2[0-8]))) #平年2月只有28天,月日表示为【02-01至02-28】
PS:如果还有加上时间的验证,那么就在上面日期的基础上加上【HH:mm:ss】的考虑。小时分为【00-12】或【00-23】两种情况,时间和分钟都是【00-59】。
参考文章:
http://www.cnblogs.com/jay-xu33/archive/2009/01/08/1371953.html
http://www.jb51.net/article/20753.htm
http://www.cnblogs.com/bit-by-bit/p/6703355.html
http://www.cnblogs.com/wyxy_czj/articles/1958221.html