日期验证年份失败

Year of date validation is failing

我需要进行日期验证才能接受 dd/mm/yyyy 格式。然而,所有条件都工作正常,除了如果我输入 6 位数字的年份,它也会接受它,比如 -

12/12/200000

根据我的代码是有效的。下面是我的代码:

function validate(value) {
            if(!value.match(/\d\d\/\d\d\/\d\d\d\d/))
                return false;
            return checkdate(value);
}

function checkdate(val)
{
    var dates = val.split(/\D/);
    if(dates[0] <= 0 || dates[0] > 31)
        return false;
    if(dates[1] <= 0 || dates[1] > 12)
        return false;
    var now = new Date(dates[2],dates[1]-1,dates[0]);
    if (isNaN(now))
        return false;
    now.setHours(0,0,0,0);
    if (now.getFullYear() == dates[2] && now.getMonth() + 1 == dates[1] && now.getDate() == dates[0])
        return true;
    return false;
}

我不确定为什么它允许年份作为 6 位有效输入?

您没有使用开始和结束分隔符来限制正则表达式,因此 12/12/200000 是一个匹配项,因为它与正则表达式匹配,然后是一些

if (!value.match(/^\d\d\/\d\d\/\d\d\d\d$/) )

作为旁注,您不必键入 \d 四次,您可以执行 \d{4} 来匹配 \d

的四个实例

问题出在 validate 函数中,它匹配的正则表达式允许输入您不想传递的有效值。除了明显的 dd/mm/yyyy 格式外,它还允许找到的文本位于字符串中的任何位置。基本上,你说要检查 "if there's said expression inside string",而它应该是 "if the whole string matches this expression"。

要解决此问题,请在开头添加 ^ 并在结尾添加 $^代表字符串开始,$代表字符串结束:

/^\d\d\/\d\d\/\d\d\d\d$/

我认为阅读 documentation 了解 JavaScript 使用的正则表达式语法会对您有所帮助。

在 at 时,人类往往难以阅读类似字符的长重复序列,例如在您的正则表达式中。这个表达式更容易理解并且做的事情完全一样:

/^\d{2}\/\d{2}\/\d{4}$/

如果要通过创建日期对象来验证日期字符串,则无需检查整个模式,只需创建日期并检查结果即可。您真的需要两位数字来表示日期和月份吗?[=​​11=]

如果您想要 4 位数的年份,则必须单独检查,因为构造函数会很乐意将两位数的年份转换为 20 世纪。如果您确实需要两位数的日期和月份,可以在检查年份的同时检查:

function validateDMY(s) {
  var b = s.split(/\D/);
  var d = new Date(b[2], --b[1], b[0]);
  return d && /^\d{4}$/.test(b[2]) && b[1] == d.getMonth();
}

console.log(validateDMY('30/02/2015')); // false
console.log(validateDMY('30/22/2015')); // false
console.log(validateDMY('02/02/15'));   // false
console.log(validateDMY('30/01/2015')); // true