日期格式:年-月-日,即yyyy-mm-dd,如今天的日期为2008-11-1,当然按照yyyy-mm-dd的模式就是2008-11-01。我们的表达式应该同时匹配这两种日期——月、日为个位数的时候,前边的‘0’可有可无。
再有的一点,估计我们匹配万年历的机会不是太多,一般情况下,小打小闹,匹配个生辰八字,起始、终止日期就够了,于是我的表达式只匹配1900-2099——估计就我一般年龄的人是很难超越这两个年份的吧……
废话少说,开始写表达式吧。
首先当然是年份了——((19|20)\d{2})。(这里用了Perl的写法,由于Javascript沿用了此法,而且这种方法确实很简洁,所以我个人非常喜欢。)
匹配年份是整个表达式中最简单的部分,以下建立月和日的表达式可能出现多种情况,我只能在整个表达式中建立多种模式以供匹配的时候选择,在这些模式中,年份的部分基本上是一样的(除了闰年)。
小学生都知道的一件事:一年的12个月里,1、3、5、7、8、10、12月份中每月有31天,4、6、9、11月份中每月有30天,而2月最特殊,2月份只有28天而且闰年的时候是29天——对于闰年,我们等处理完一般情况再考虑特殊处理。
31天的月份——(0?[13578]|1[02])。
日期——(0?[1-9]|[12]\d|3[01])。
1. 综上,匹配31天的月份模式为:/(年)-(月)-(日)/,即((19|20)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01])
30天的月份——(0?[469]|11)。
日期——(0?[1-9]|[12]\d|30)。
2. 综上,匹配30天的月份模式为:/(年)-(月)-(日)/,即((19|20)\d{2})-(0?[469]|11)-(0?[1-9]|[12]\d|30)
以下匹配一般年份的2月,即28天的2月。
月份——0?2
日