比较完美的日期验证正则表达式(2011-6-1更新)

来源:互联网 发布:大数据未来就业前景 编辑:程序博客网 时间:2024/05/18 16:55

  我始终没有找到完美的日期验证正则表达式,这要问题就是对瑞年的判断。

  我们知道,每 400 年会有 97 个闰年(参见高中《地理》课本),完整的瑞年判断是这样的:
  瑞年的年份
  1) 若是整百年,能被 400 整除
  否则
  2) 能被 4 整除

下面给出代码,主要是为 String 原型添加 isDate 方法:

<script type="text/javascript">
// 分隔符
Separator = {
    ANY: ".",
    DASH: "-",
    DOT: "//.",
    SLASH: "/"
};
String.prototype.isDate = function(sep) {
    var reStr = "^(((([0-9]{2}(([2468][048])|([02468][48])|([13579][26])))|((([02468][048])|([13579][26]))(00)))(-)(2|02)(-)(([0]?[1-9])|([1-2][0-9])))|((([0-9]{2}([02468][1235679])|([13579][01345789]))|((([02468][1235679])|([13579][01345789]))(00)))(-)(2|02)(-)(([0]?[1-9])|([1][0-9])|([2][0-8])))|(([0-9]{4})(-)(((([0]?(1|3|5|7|8))|(10|12))(-)(([0]?[1-9])|([1-2][0-9])|30|31))|(((([0]?(4|6|9))|11))(-)(([0]?[1-9])|([1-2][0-9])|30)))))$";
    if(typeof(sep) == "string")
        reStr = reStr.replace(//(-/)/g, "(" + sep + ")");
    var re = new RegExp(reStr, "g");
    return re.test(this);
};
alert("2100-2-29".isDate());   
alert("2000/02/29".isDate(Separator.SLASH));
alert("2007/5/22".isDate(Separator.SLASH));
alert("2007-09-31".isDate());
alert("2004.02.29".isDate(Separator.DOT));
alert("2008-02-29".isDate());
// 结果
// false
// true
// true
// false
// true
// true
</script>

上面的正则表达式可以看成是由三个正则表达式拼接而成,瑞年二月判断、非闰年二月判断、其它月份判断。

 

2011-6-1更新:漏掉了9月份的日期判断

原创粉丝点击