Javascript正则表达式来验证日期

时间:2011-04-25 03:37:21

标签: 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)))$

由于

6 个答案:

答案 0 :(得分:2)

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

jsFiddle

请注意,这将允许它们混淆,即01/02-2010有效。为了阻止这种情况,请将其写出三次......

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

jsFiddle

(或只检查cwolves's wonderful answer。)


你的问题标题是......

  

Javascript正则表达式验证日期

如果你还需要提取部分,请用括号(())包裹它们,这将把它们变成捕获组。如果成功匹配,它们将存储在返回数组的成员中。

答案 1 :(得分:2)

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

将匹配01/01/200001.01.2000,而不是01/01.2000

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

在包装三个日期部分时也一样。

答案 2 :(得分:2)

我已经看到一些与实际日期相匹配的怪物正则表达式 - 例如,它们不匹配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

* /

答案 3 :(得分:0)

在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?)')).'$#';

但我不认为在JS中这样可能。也许以其他方式命名匹配...

修改
我试过这个:

'2004-8-29'.match(/^(\3\d{4})-(\2\d\d?)-(\1\d\d?)$/)

但我认为不是......(在实际捕获/匹配之前注意\ 3,\ 2和\ 1)

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

答案 4 :(得分:0)

我不喜欢为.-/

重复一次模式

尝试以下内容:

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

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

答案 5 :(得分:0)

一个有趣的技巧是你可以使用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')

这不是非常严格。例如,它将成功解析2/30/2011为有效。不过,这是一个很好的99%严格的健全测试。