1.验证日期的正则表达式加入闰年的判断以及思路分析
 
     进入正题之前,我们需要澄清两个概念:
     ①什么是合法的日期范围?对于不同的应用场景,这个问题有不同的解释。这里采纳MSDN中的约定:
     DataTime值类型标示值范围在公元(基督纪元)000111日午夜12:00:00到公元(C.E.)99991231日晚上11:59:59之间的日期和时间。
     ②关于闰年的阐释。人民教育出版社小学数学室的解释浅明易懂:
     关于公历闰年是这样规定的:地球绕太阳公转一周叫做一回归年,一回归年长36554846秒。因此,公历规定有平年和闰年,平年一年有365日,比回归年短0.2422日,四年共短0.9688js正则表达式判断数字日,故每四年增加一日,这一年有366日,就是闰年。但四年增加一日比四个回归年又多0.0312日,400年后将多3.12日,故在400年中少设3个闰年,也就是在400年中只
97个闰年,这样公历年的平均长度与回归年就相近似了。由此规定:年份是整百数的必须是400的倍数才是闰年,例如 1900年,2010 年就不是闰年。
     清楚了以上两个概念,进入正题。
     首先要验证年份,显然,年份范围为 0001-9999,匹配YYYY的正则表达式为:
     [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}
     其中 [0-9] 也可以表示为 \d,但 \d 不如 [0-9] 直观,因此下面将一直采用[0-9]
     用正则表达式验证日期的难点有二:一是大小月份的天数不同,二是闰年的考虑。
     对于第一个难点,我们首先不考虑闰年,假设2月份都是28天,这样,月份和日期可以分成三种情况:
     ①月份为1,3,5,7,8,10,12,天数范围为01-31,匹配MM-DD的正则表达式为:
     (0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])
     ②月份为4,6,9,11,天数范围为01-30,匹配MM-DD的正则表达式为:
     (0[469]|11)-(0[1-9]|[12][0-9]|30)
     ③月份为2,考虑平年情况,匹配MM-DD的正则表达式为:
     02-(0[1-9]|1[0-9]|2[0-8])
     根据上面的成果,我们可以得到匹配平年日期格式为YYYY-MM-DD的正则表达式:
     ([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})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|1[0-9]|2[0-8])))
     接下来我们来解决第二个难点:闰年的考虑。根据闰年的定义,我们可以将闰年分为两类:
     ①能被4整除但不能被100整除的年份。寻后两位的变化规律,可以很快得到下面的正则匹配:
     ([0-9]{2})(0[48]|[2468][048]|[13579[26])
     ②能被400整除的年份。能被400整除的数肯定能被100整除,因此后两位肯定是00,我们只要保证前两位能被4整除即可,相应的正则表达式为:
     (0[48]|[2468][048]|[13579][26])00
2.将平年和闰年的日期验证表达式合并,我们得到做宏验证日期格式为YYYY-MM-DD的正则表达式为:
     (([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})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|1[0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579[26]))|((0[48]|[2468][048]|[13579][26])00)-02-29)
3.最强验证日期的正则表达式,添加了闰年的验证
     这个日期正则表达式支持
     YYYY-MM-DD
     YYYY/MM/DD
     YYYY_MM_DD
     YYYY.MM.DD
     的形式
     match: 2008-2-29 2008/02/29
     not match: 2008-2-30 2007/02/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})[-\/\._](((0[13578]|1[02])[-\/\._](0[1-9]|[12][0-9]|3[01]))|((0[469]|11)[-\/\._](0[1-9]|[12][0-9]|30))|(02-(0[1-9]|1[0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579[26]))|((0[48]|[2468][048]|[13579][26])00)[-\/\._]02[-\/\._]29)$)
4.例子
iDate=2011-02-28

Function RegExpfind(p,s)
  Dim regEx
  Set regEx=new RegExp
  regEx.Pattern=p
  regEx.IgnoreCase=True
  regEx.Global=True
  regExpfind=regEx.Test(s)
End Function

If (RegExpfind("^(([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})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|1[0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579[26]))|((0[48]|[2468][048]|[13579][26])00)-02-29)$",iDate)) Then
    msgbox "日期格式正确"
    else
    msgbox "日期格式不正确"
End If

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。