使用javascript正则表达式验证日期的问题

时间:2013-02-04 17:05:37

标签: javascript regex date validation

我正在尝试使用javascript正则表达式验证日期输入,但它返回的有效日期无效。我不是正则表达式的专家,所以我不知道它有什么问题:

/^([0-9]d{2})+(\.|-|\/)+([0-9]d{2})+(\.|-|\/)+([0-9]d{4})+$/

我希望接受这些日期格式:

23/04/2001

23-04-2001

2001年4月23日

最初我有这个,但它最终接受了与其他角色的约会,如23/04 / 2001jhsdgf:

/\d{2}(\.|-|\/)\d{2}(\.|-|\/)\d{4}/;

2 个答案:

答案 0 :(得分:4)

使用原始正则表达式,然后将新版本中的^$添加到其中。问题解决了。

编辑:虽然,(\.|-|\/)确实是一团糟,而应该是[.\/-]

编辑2:也就是说,如果您创建第一个([.\/-]),那么您可以用\1替换第二个,然后它将需要两个分隔符相同。

答案 1 :(得分:4)

您可以使用正则表达式检查日期在语法上是否正确:

/^(\d{1,2})([-\.\/])(\d{1,2})\2(\d{4})$/
  • ^$分别匹配字符串的开头和结尾
  • \d{1,2}匹配1或2位数字
  • \d{4}恰好匹配4位数字
  • \2匹配第二个捕获组(- . /
  • 中捕获的字符串

如果匹配,您可以使用匹配的日期,月份和年份来构建新日期,并将生成的日期,月份,年份与匹配的值进行比较。这是一个功能就是这样:

function checkDate(dateText) {
    var match = dateText.match(/^(\d{1,2})([-\.\/])(\d{1,2})\2(\d{4})$/);
    // "31.04.2012" -> ["31.04.2012", "31", ".", "04", "2012"]
    if (match === null) {
        return false;
    }
    var date = new Date(+match[4], +match[3] - 1, +match[1]);
    return date.getFullYear() == +match[4] && 
      date.getMonth() == +match[3] - 1 && 
      date.getDate() == +match[1];
}
checkDate("30.04.2013"); // true
checkDate("31-04-2013"); // false (April has 30 days)
  • +用于将字符串转换为数字(+"01"变为1
  • 月份为0(0 = 1月,1 = 2月,...)
  • 以上示例假定日期为dd-mm-yyyy格式

Date对象尝试更正无效日期。尝试创建31-4-2013生成1-05-2013之类的日期时,上述函数会将结果日期与输入参数进行比较,以检查其有效性。