日期格式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])
现在月份和日期都判断完了,再考虑年的情况。这里年的范围是0001至9999。判断的正则表达式为:
[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]))
现在所有的条件都考虑了,剩下的就是合并了。
不考虑闰年的2月29号的情况:
([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]))
考虑了闰年的2月29号的最终表达式为:
([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