在javascript中验证mm/dd/yyyy格式的短日期和长日期的正则表达式

在javascript中验证mm/dd/yyyy格式的短日期和长日期的正则表达式,javascript,regex,datetime,Javascript,Regex,Datetime,我想验证日期,它可以是短日期格式或长日期格式。 对于一些有效日期 2010年5月12日,2010年5月12日,2010年5月12日,2010年5月12日 var reLong = /\b\d{1,2}[\/-]\d{1,2}[\/-]\d{4}\b/; var reShort = /\b\d{1,2}[\/-]\d{1,2}[\/-]\d{2}\b/; var valid = (reLong.test(entry)) || (reShort.test(entry)); if(valid) { r

我想验证日期,它可以是短日期格式或长日期格式。 对于一些有效日期

2010年5月12日,2010年5月12日,2010年5月12日,2010年5月12日

var reLong = /\b\d{1,2}[\/-]\d{1,2}[\/-]\d{4}\b/;
var reShort = /\b\d{1,2}[\/-]\d{1,2}[\/-]\d{2}\b/;
var valid = (reLong.test(entry)) || (reShort.test(entry));
if(valid)
{
return true;
}
else
{
return false;
}

但是,当我尝试将无效日期指定为12/05/20-0时,当前正则表达式失败,这是因为
12/05/20
是输入的子字符串
12/05/20-0
是有效日期

要避免子字符串匹配,可以将锚定用作:

/^\d{1,2}[\/-]\d{1,2}[\/-]\d{4}$/
但同样,上面允许的日期,如
00/00/0000
29/02/非闰年
无效

因此,最好使用库函数进行验证


我能够找到一个这样的库:

发生这种情况是因为
12/05/20
是您输入的子字符串
12/05/20-0
是一个有效日期

要避免子字符串匹配,可以将锚定用作:

/^\d{1,2}[\/-]\d{1,2}[\/-]\d{4}$/
但同样,上面允许的日期,如
00/00/0000
29/02/非闰年
无效

因此,最好使用库函数进行验证


我找到了一个这样的库:

这里有一个稍微更健壮的正则表达式,它将尝试过滤掉一些不好的日期:

^(1[012]|0[1-9])([\/\-])(0[1-9]|[12]\d|3[01])\2((?:19|20)?\d{2})$
输入(如上所示)

日匹配:01-31,月匹配:01-12,年匹配1900-2099。它还将强制您输入一致的分隔符(即:
mm/dd/yyyyy
mm-dd-yyyy
有效,但
mm-dd/yyyyy
无效)


这仍然需要一些糟糕的日期(如2000年2月30日),但从实际角度来看,这应该足够好了。这也会将月、日和年分别放在捕获组1、2和3中。

这里有一个稍微健壮的正则表达式,它将尝试过滤掉一些不好的日期:

^(1[012]|0[1-9])([\/\-])(0[1-9]|[12]\d|3[01])\2((?:19|20)?\d{2})$
输入(如上所示)

日匹配:01-31,月匹配:01-12,年匹配1900-2099。它还将强制您输入一致的分隔符(即:
mm/dd/yyyyy
mm-dd-yyyy
有效,但
mm-dd/yyyyy
无效)


这仍然需要一些糟糕的日期(如2000年2月30日),但从实际角度来看,这应该足够好了。这也将把月、日和年分别放在捕获组1、2和3中。

codedict是正确的。顺便说一句,您可能能够将2个正则表达式组合成一个:^\d{1,2}[\/-]\d{1,2}[\/-](\d{2}}\d{4})$。。。mm的第一个数字也可以进一步优化,这取决于你想做什么。顺便说一句,您可能能够将2个正则表达式组合成一个:^\d{1,2}[\/-]\d{1,2}[\/-](\d{2}}\d{4})$。。。mm的第一个数字也可以进一步优化-取决于你想做什么。这会验证短日期和长日期吗?这会验证短日期和长日期吗?