Javascript 正则表达式日期表达式不工作

Javascript 正则表达式日期表达式不工作,javascript,regex,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 ^

我有一个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)是否有任何问题


有什么想法吗

尝试转义正斜杠


例如:
^(0[1-9]|[12][0-9]|[3[01])\/(0[1-9]| 1[012])\/(19 | 20)\d{2}$
尝试转义正斜杠


例如:
^(0[1-9]|[12][0-9]|[3[01])\/(0[1-9]| 1[012])\/(19 | 20)\d{2}$
如果使用构造函数
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做什么

如果使用构造函数
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”

尝试使用双斜杠:
“\\d”

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


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

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

尝试使用双斜杠:
“\\d”

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

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

您需要使用
“\\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>");
这将重新设置修复程序:

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>");
您需要使用
“\\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>");
这将重新设置修复程序:

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>");

不带regexp的验证怎么样

函数validateDate(字符串){
var parts=string.split(“/”);
var年=parseInt(第[2]部分);
var月=parseInt(第[1]部分)-1;
var day=parseInt(部分[0]);
var日期=新日期(年、月、日);
返回日期.getFullYear()==年和日期.getMonth()==月和日期.getDate()==天;
}

没有regexp的验证怎么样

函数validateDate(字符串){
var parts=string.split(“/”);
var年=parseInt(第[2]部分);
var月=parseInt(第[1]部分)-1;
var day=parseInt(部分[0]);
var日期=新日期(年、月、日);
返回日期.getFullYear()==年和日期.getMonth()==月和日期.getDate()==天;
}


使用本机JS
Date
对象来验证日期,而不是regexp。始终包括测试数据。或者更好:一个演示(例如在jsbin.com上)你是否将
\
字符转义为字符串?@Prinzhorn-我只是用我的生日-08/03/1977@dotnetnoob好吧你知道,我从未使用过这种日期格式(其他国家/地区),如果能在正则表达式中加入一些数据就好了。使用原生JS
date
对象来验证日期,而不是regexp。始终包含测试数据。或者更好:一个演示(例如在jsbin.com上)你是否将
\
字符转义为字符串?@Prinzhorn-我只是用我的生日-08/03/1977@dotnetnoob好吧你知道,我从来没有使用过这种日期格式(其他国家/地区),如果我能在正则表达式中加入一些数据就好了。+1通常是更好的方法(因为我的答案中列出的原因)+1通常是更好的方法(因为我的答案中列出的原因)第二个正则表达式在跳过正斜杠后似乎对我有效。第二个正则表达式在逃离正斜杠后似乎对我有效。日期是很难处理的事情。在世界的某些地区,他们使用DD/MM/YYYY,而不是MM/DD/YYYY。这就是我一直尝试使用YYYY-MM-DD的原因。如果可能的话,它是唯一普遍理解的日期格式。甚至不要让我开始尝试处理时区…@UselessCode-同意,尽管OP似乎决定使用特定的、定义良好的格式。谢谢,我将使用正则表达式来测试dd/mm/yyyy格式,但随后将javascript用于日期。@dotnetnoob-如果您使用混合方法,并且只想确保数字和斜杠都存在,那么只需使用
“^\\d{2}/\\d{2}/\\d{4}$”日期就可以显著简化操作。在世界的某些地区,他们使用DD/MM/YYYY,而不是MM/DD/YYYY。这就是我一直尝试使用YYYY-MM-DD的原因。如果可能的话,它是唯一普遍理解的日期格式。甚至不要让我开始尝试处理时区…@UselessCode-同意,尽管OP似乎决定使用特定的、定义良好的格式。谢谢,我将使用正则表达式来测试dd/mm/yyyy格式,但随后将javascript用于日期。@dotnetnoob-如果您使用混合方法,并且只想确保数字和斜杠都存在,那么只需使用
“^\\d{2}/\\d{2}/\\d{4}$”