-1

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

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

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

2001 年 4 月 23 日

23-04-2001

23.04.2001

最初我有这个,但它最后接受了其他字符的日期,如 23/04/2001jhsdgf:

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

2 回答 2

4

拿你原来的正则表达式,然后从你的新正则表达式中添加^和。$问题解决了。

编辑:虽然,真的,这(\.|-|\/)是一团糟,应该是[.\/-]

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

于 2013-02-04T17:06:32.617 回答
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 = 二月,...)
  • 上面的例子假设日期是dd-mm-yyyy格式

Date对象尝试更正无效日期。尝试创建一个日期,例如31-4-2013yield 1-05-2013,上面的函数将结果日期与输入参数进行比较以检查有效性。

于 2013-02-04T19:08:42.727 回答