【问题标题】:Year of date validation is failing年份日期验证失败
【发布时间】:2015-01-24 07:47:05
【问题描述】:

我需要进行日期验证才能以 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 位有效输入?

【问题讨论】:

  • 您的拆分可能不正确。没有什么能匹配你的分裂
  • 但是 reg exp 不应该允许代码到那时
  • 创建一个像 var regExp = /\d{2}\/\d{2}\/\d{4}/ 这样的正则表达式,然后用 match() 函数检查它,然后你不必创建任何额外的函数来检查每个字段的有效性

标签: javascript regex validation


【解决方案1】:

问题出在validate 函数中,它匹配的正则表达式允许您不想传递的输入值有效。除了明显的dd/mm/yyyy 格式外,它还允许找到的文本位于字符串中的任何位置。基本上,您说要检查“字符串中是否存在所述表达式”,而应该是“是否整个字符串与该表达式匹配”。

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

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

我认为阅读 documentation 了解 JavaScript 使用的正则表达式语法会让您受益。

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

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

【讨论】:

    【解决方案2】:

    你没有用开始和停止分隔符限制正则表达式,所以12/12/200000 是匹配的,因为它匹配正则表达式,然后是一些

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

    作为旁注,您不必输入四次\d,您可以输入\d{4} 来匹配\d 的四个实例

    【讨论】:

    • 感谢根据您的建议更改 reg exp 解决了我的问题
    【解决方案3】:

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

    如果您想要一个 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
    

    【讨论】:

    • 感谢您提供详细信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2013-06-03
    • 1970-01-01
    相关资源
    最近更新 更多