0

我有一个 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 位数字。所有看起来都完全有效,但只有第三个返回 true。

我试图了解我是否做错了什么,或者浏览器(Firefox)是否有任何问题。

有任何想法吗?

4

5 回答 5

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;
}

演示

于 2013-02-07T16:36:26.960 回答
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 做什么?

于 2013-02-07T16:22:07.690 回答
1

您可能将这些正则表达式放入字符串中,在这种情况下,"\d"将被翻译成"d".

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

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

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

于 2013-02-07T16:31:24.260 回答
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
于 2013-02-07T16:32:13.170 回答
0

尝试转义正斜杠

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

于 2013-02-07T16:15:07.127 回答