正则表达式日期表达式无效

时间:2013-02-07 16:09:52

标签: javascript regex

我有一个javascript函数可以进行日期验证。

var regex = new RegExp(my regex expression is here);

var result = regex.test(valueToTest);

然而,在过去几个小时里我一直在追尾,因为测试总是错误的。

This does not work
^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\d\d$

This does not work
^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\d{2}$

This works
^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)[0-9]{2}$

3种模式之间的唯一区别是最后2位数。所有看起来都非常有效,但只有第3个返回true。

我试图了解是否有任何错误,或浏览器是否存在任何问题(Firefox)。

有什么想法吗?

5 个答案:

答案 0 :(得分:3)

没有正则表达式的验证怎么样?

function validateDate(string) {
    var parts = string.split("/");
    var year = parseInt(parts[2]);
    var month = parseInt(parts[1]) - 1;
    var day = parseInt(parts[0]);
    var date = new Date(year, month, day);
    return date.getFullYear() === year && date.getMonth() === month && date.getDate() === day;
}

Demo

答案 1 :(得分:1)

如果使用构造函数new RegExp(),则应使用字符串格式:

示例:

var regex = new RegExp(my regex expression is here);
var result = regex.test("(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)[0-9]{2}" ,"ig");

但我不建议你使用构造函数尝试使用它:

result.match(/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(19|20)[0-9]{2}$/ig);

如果不是您想要对RegExp做什么?

答案 2 :(得分:1)

您可能正在将这些正则表达式放入字符串中,在这种情况下,"\d"正在转换为"d"

尝试使用双斜杠:"\\d"

但是,我必须同意其他一些建议 - 不要使用正则表达式来解析日期。他们并不适合这份工作。

例如,表达式允许'31/02/1985'不是日期。特别是,您遇到leap years的问题(除了在400年的时间跨度内3年以外,每4年发生一次)。尝试将其与正则表达式匹配!

答案 3 :(得分:1)

您需要使用"\\d"代替"\d"

使用测试数据重新解决您的问题:

var regex1 = new RegExp("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\d\d$");
var regex2 = new RegExp("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\d{2}$");
var regex3 = new RegExp("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)[0-9]{2}$");

document.write("<div>1: "+regex1.test("22/11/1982")+"</div>");
document.write("<div>2: "+regex2.test("22/11/1982")+"</div>");
document.write("<div>3: "+regex3.test("22/11/1982")+"</div>");

输出:

1: false
2: false
3: true

这重新修复了修补程序:

var regex1 = new RegExp("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\\d\\d$");
var regex2 = new RegExp("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\\d{2}$");
var regex3 = new RegExp("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)[0-9]{2}$");

document.write("<div>1: "+regex1.test("22/11/1982")+"</div>");
document.write("<div>2: "+regex2.test("22/11/1982")+"</div>");
document.write("<div>3: "+regex3.test("22/11/1982")+"</div>");

输出:

1: true
2: true
3: true

答案 4 :(得分:0)

尝试转发正斜杠

例如:^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(19|20)\d{2}$