我有一个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)。
有什么想法吗?
答案 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;
}
答案 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}$