日期格式验证

日期格式yyyyMMdd正则表达式:    
  var reg = /^([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})((0[13578]|10|12)(0[1-9]|1[0-9]|2[0-9]|3[01])|(0[469]|11)(0[1-9]|1[0-9]|2[0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))|(((0[48]|[13579][26]|[2468][048])000209)|([0-9]{2}(0[48]|[13579][26]|[2468][048])0209))$/;  //已做测试
 
 

用正则表达式如何判断日期yyyyMMdd。日期判断涉及到闰年平年的判断,大月小月的判断等。由于好久没用正则表达式了,所以只能一步一步的来实现日期的判断。最后竟成功了,下面分享一下这个过程。

         首先,我想到的是大月的判断。1,3,5,7,8,10,12这几个月都是31天,有相似之处,但是又稍有不同。

(0[13578]|10|12)(0[1-9]|1[0-9]|2[0-9]|3[01])                   //前一个括号是月的判断,后一个括号是日期的判断

测试了一下成功了,接下来进行小月的判断,30天的月份有4,6,9,11。与判断大月基本类似:

(0[469]|11)(0[1-9]|1[0-9]|2[0-9]|30)                                  

然后判断2月份,先考虑28天的情况

02(0[1-9]|1[0-9]|2[0-8]) 

现在月份和日期都判断完了,再考虑年的情况。这里年的范围是00019999。判断的正则表达式为:

[0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3}< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

然后考虑闰年的情况,闰年又分为两种情况,一种是正百年能够被400整除,另一种是非整百年能被4整除。整百年的情况,主要是前两位:04,08;头一位是偶数的,[2468][048];头一位是奇数的,[13579][26]:

(0[48]|[13579][26]|[2468][048])00

         另一种闰年的情况,非百年能被4整除的年,主要是考虑后两位能被4整除,与上面的类似也分奇偶:

[0-9]{2}(0[48]|[13579][26]|[2468][048])

         将闰年的合并:

((0[48]|[13579][26]|[2468][048])00)|([0-9]{2}(0[48]|[13579][26]|[2468][048]))

 

现在所有的条件都考虑了,剩下的就是合并了。

不考虑闰年的229号的情况:

([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})((0[13578]|10|12)(0[1-9]|1[0-9]|2[0-9]|3[01])|(0[469]|11)(0[1-9]|1[0-9]|2[0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))

考虑了闰年的229号的最终表达式为:

([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})((0[13578]|10|12)(0[1-9]|1[0-9]|2[0-9]|3[01])|(0[469]|11)(0[1-9]|1[0-9]|2[0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))|(((0[48]|[13579][26]|[2468][048])000209)|([0-9]{2}(0[48]|[13579][26]|[2468][048])0209

posted @ 2015-11-18 14:59  流沙吹风  阅读(239)  评论(0编辑  收藏  举报