验证日期的Javascript正则表达式

验证日期的Javascript正则表达式,javascript,regex,date,Javascript,Regex,Date,我对正则表达式相当不熟悉。我正在尝试为mm.dd.yyyy、mm/dd/yyyy或mm-dd-yyyy编写正则表达式。这就是我到目前为止所拥有的,我完全不确定我是否已经接近了 ^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$ 谢谢 请注意,这将允许它们混淆,即01/02-2010将有效。要停止这一点

我对正则表达式相当不熟悉。我正在尝试为mm.dd.yyyy、mm/dd/yyyy或mm-dd-yyyy编写正则表达式。这就是我到目前为止所拥有的,我完全不确定我是否已经接近了

^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$
谢谢

请注意,这将允许它们混淆,即
01/02-2010
将有效。要停止这一点,请像这样写三遍

/^(?:\d{2}\.\d{2}\.\d{4}|\d{2}\/\d{2}\/\d{4}|\d{2}-\d{2}-\d{4})$/

(或者只是检查一下。)


你的题目是

验证日期的Javascript正则表达式

如果您还需要提取这些部分,请使用括号(
()
)将它们包装起来,这样可以将它们转换为捕获组。如果匹配成功,它们将存储在返回数组的成员中

请注意,这将允许它们混淆,即
01/02-2010
将有效。要停止这一点,请像这样写三遍

/^(?:\d{2}\.\d{2}\.\d{4}|\d{2}\/\d{2}\/\d{4}|\d{2}-\d{2}-\d{4})$/

(或者只是检查一下。)


你的题目是

验证日期的Javascript正则表达式


如果您还需要提取这些部分,请使用括号(
()
)将它们包装起来,这样可以将它们转换为捕获组。如果匹配成功,它们将存储在返回数组的成员中。

在PHP中,我使用命名匹配,因此不同的格式很容易:

$format = 'y-m-d'; // or 'd-m-y' or 'd/m/y' etc
$regexp = '#^'.strtr(preg_quote($format), array('y' => '(?P<year>(?:1|2)\d{3})', 'm' => '(?P<month>\d\d?)', 'd' => '(?P<day>\d\d?)')).'$#';
但我不认为是这样。。。(请注意实际捕获/匹配之前的\3、\2和\1)


按顺序1、2、3匹配。按顺序3,2,1,它没有。我不确定PHP中的
\1
\2
\3
do=)

使用命名匹配,因此不同的格式很容易:

$format = 'y-m-d'; // or 'd-m-y' or 'd/m/y' etc
$regexp = '#^'.strtr(preg_quote($format), array('y' => '(?P<year>(?:1|2)\d{3})', 'm' => '(?P<month>\d\d?)', 'd' => '(?P<day>\d\d?)')).'$#';
但我不认为是这样。。。(请注意实际捕获/匹配之前的\3、\2和\1)

按顺序1、2、3匹配。按顺序3,2,1,它没有。不确定
\1
\2
\3
做什么=)

将匹配
01/01/2000
01.01.2000
,而不是
01/01.2000

/^(\d{2})([.\/-])(\d{2})\2(\d{4})$/
包装三个日期部分时也会执行相同的操作

将匹配
01/01/2000
01.01.2000
,而不是
01/01.2000

/^(\d{2})([.\/-])(\d{2})\2(\d{4})$/

包装三个日期部分时也会这样做。

我不喜欢对
-
/
分别重复一次模式

请尝试以下方法:

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

请注意,使用
\2
表示第二个匹配组,即
-
/
组。这将确保mm和dd之间的任何符号都将在dd和yyyy之间匹配。

我不喜欢对
-
/
每个模式重复一次

请尝试以下方法:

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

请注意,使用
\2
表示第二个匹配组,即
-
/
组。这将确保mm和dd之间的任何符号都将在dd和yyyy之间匹配。

一个有趣的技巧是,您可以使用Date.parse()执行以下操作:

// 1303617600000
Date.parse('4/24/2011')

// 1303617600000
Date.parse('4-24-2011')

// 1303617600000
Date.parse('4.24.2011')

// NaN
Date.parse('4/32/2011')

// NaN
Date.parse('foo')

这不是很严格。例如,它将成功地将2011年2月30日解析为有效。这是一个很好的99%严格的健全性测试。

一个有趣的技巧是,您可以使用Date.parse()执行以下操作:

// 1303617600000
Date.parse('4/24/2011')

// 1303617600000
Date.parse('4-24-2011')

// 1303617600000
Date.parse('4.24.2011')

// NaN
Date.parse('4/32/2011')

// NaN
Date.parse('foo')

这不是很严格。例如,它将成功地将2011年2月30日解析为有效。这是一个很好的99%严格的健全性测试。

我看到一些怪物正则表达式与实际日期匹配,例如,它们与04/31/yyyy或02-29-2011不匹配

更简单的方法是尝试从输入中创建一个日期,然后检查输入

function isvalid_mdy(s){
    var day, A= s.split(/\D+/).map(function(itm){
        return parseInt(itm, 10)
    });
    try{
        day= new Date(A[2], A[0]-1, A[1]);
        if(day.getMonth()+1== A[0] && day.getDate()== A[1]) return day;
        throw 'Bad Date Format';
    }
    catch(er){
        return NaN;
    }

}

var s1= '04/31/2011';
isvalid_mdy(s1)

/*  returned value: (Number)
NaN

*/

我看到一些怪物正则表达式与实际日期匹配——例如,它们与04/31/yyyy或02-29-2011不匹配

更简单的方法是尝试从输入中创建一个日期,然后检查输入

function isvalid_mdy(s){
    var day, A= s.split(/\D+/).map(function(itm){
        return parseInt(itm, 10)
    });
    try{
        day= new Date(A[2], A[0]-1, A[1]);
        if(day.getMonth()+1== A[0] && day.getDate()== A[1]) return day;
        throw 'Bad Date Format';
    }
    catch(er){
        return NaN;
    }

}

var s1= '04/31/2011';
isvalid_mdy(s1)

/*  returned value: (Number)
NaN


*/

@alex:我应该把它放在哪里?谢谢@willis您可以像这样使用它
dateStr.match(/regex here/)
。如果它返回
null
,则它不匹配。
/^\d{2}([.\/-])\d{2}\1\d{4}$/
不需要第二个示例。@alex:我到底把它放在哪里?谢谢@willis您可以像这样使用它
dateStr.match(/regex here/)
。如果它返回
null
,则它不匹配。
/^\d{2}([.\/-])\d{2}\1\d{4}$/
第二个例子不需要。@Dave Ward:我不想挤兑你的答案,但你能完整地写出来吗,我不理解它的原样?谢谢你确定这样行吗<代码>变量d=日期解析(“4-24-2011”)gives
NaN
@manojlds:是的,我在发布之前在控制台上测试了所有这些。但是,如果浏览器的区域设置不是使用mm/dd/yyyy日期的区域设置,则可能不起作用。它适用于“/”但不适用于“.”和“-”,无论是mm/dd/yyyy还是dd/mm/yyyy。无论如何,如果基于用户的区域设置等,此操作不起作用,则解决方案是错误的。@willis0924:Test for
Date.parse(dateString)!=NaN
@Dave Ward:我不是想挤兑你的答案,但是你能把它完整地写出来吗?我不太明白它的意思?谢谢你确定这样行吗<代码>变量d=日期解析(“4-24-2011”)gives
NaN
@manojlds:是的,我在发布之前在控制台上测试了所有这些。但是,如果浏览器的区域设置不是使用mm/dd/yyyy日期的区域设置,则可能不起作用。它适用于“/”但不适用于“.”和“-”,无论是mm/dd/yyyy还是dd/mm/yyyy。无论如何,如果基于用户的区域设置等,此操作不起作用,则解决方案是错误的。@willis0924:Test for
Date.parse(dateString)!=NaN
。这是我迄今为止见过的最好的一次。好的,这是我见过的最好的。很好。@kennebec为您提供了一个比正则表达式好得多的完美解决方案,您应该接受他的答案。@kennebec为您提供了一个比正则表达式好得多的完美解决方案,您应该接受他的答案。所以
\1
引用了第一组?我想了解,谢谢你