前言
判断闰年的规则:
1、能被400整除
2、能被4整除不能被100整除
日期正则表达式的构建思想:
平年365天,闰年366天,只有在闰年的时候,2月有29天,其余年份,2月总是只有28天,而其余月份是的天数是一样的。那么,只需要对所有的年份(包括闰年)构建出2月只有28天(其余月份正常表示)的正则表达式,(如果此时能够识别出,那么日期就是正常的,如果不能识别出,还有一种可能是闰年的2月29日),所以最后只需用闰年的2月29日的正则表达式与前面的正则表达式相或即可,最后识别不出来的就不是正确的日期。
1.表示所有年份的正则表达式(YYYY) 0000-9999
ordinaryYearRegular = ([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.表示一年中所有31天的日期的正则表达式(MM-DD)
bigMonthRegular = ((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))
3.表示一年中所有30天的日期的正则表达式(MM-DD)
smallMothRegular = ((0[469]|11)-(0[1-9]|[12][0-9]|30))
4.表示二月只有28天的正则表达式(MM-DD)
februaryExceptForTheLastDayRegular = (02-(0[1-9]|1[0-9]|2[0-8]))
5.表示闰年二月第29天的正则表达式(MM-DD)
februaryTheLastDayRegular = (02-29)
6.表示能被4整除不能被100整除的闰年的正则表达式(YYYY)
leapYearRegular1 = (([0-9]{2})(0[48]|[2468][048]|[13579][26]))
7.表示能被400整除的闰年正则表达式(YYYY)
leapYearRegular2 = ((0[48]|[2468][048]|[3579][26])00)
8.最后日期的正则表达式为
//这里只是对日期的简单表示,并不是真正的代码(其中中括号是为了和小括号区分,别看花了眼)
[ordinaryYearRegular + "-" + (bigMonthRegular | smallMothRegular | februaryExceptForTheLastDayRegular)]
| [(leapYearRegular1 | leapYearRegular2) + "-" + februaryTheLastDayRegular ]
9.下面是Angular前端中的代码:
// 所有的年份
private ordinaryYearRegular: string = '([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})';
// 大月
private bigMonthRegular: string = '((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))';
// 小月
private smallMothRegular: string = '((0[469]|11)-(0[1-9]|[12][0-9]|30))';
// 二月前28天
private februaryExceptForTheLastDayRegular: string = '(02-(0[1-9]|1[0-9]|2[0-8]))';
// 闰年二月第29天
private februaryTheLastDayRegular: string = '(02-29)';
// 能被4整除不能被100整除
private leapYearRegular1: string = '(([0-9]{2})(0[48]|[2468][048]|[13579][26]))';
// 能被400整除
private leapYearRegular2: string = '((0[48]|[2468][048]|[3579][26])00)';
// 日期的正则化表示
private dateRegularExpression: RegExp = new RegExp('(' + this.ordinaryYearRegular + '-('
+ this.smallMothRegular + '|' + this.bigMonthRegular + '|'
+ this.februaryExceptForTheLastDayRegular + '))|((' + this.leapYearRegular1 +
'|' + this.leapYearRegular2 + ')-' + this.februaryTheLastDayRegular + ')');