Regex日期表达式不起作用

Regex date expression not working

本文关键字:不起作用 表达式 日期 Regex      更新时间:2023-09-26

我有一个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}$

这三种模式之间的唯一区别是最后两位数字。所有这些看起来都是完全有效的,但只有第三个返回true。

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

有什么想法吗?

没有regexp的验证如何?

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

演示

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

尝试使用双斜线:"''d"

然而,我必须同意其他一些建议——不要使用regex来解析日期。他们真的不适合这份工作。

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

如果使用构造函数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做什么?

您需要使用"''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

尝试转义正斜杠

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