我对正则表达式不太熟悉。我正在尝试为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)))$
由于
答案 0 :(得分:2)
/^\d{2}[.\/-]\d{2}[.\/-]\d{4}$/
请注意,这将允许它们混淆,即01/02-2010
有效。为了阻止这种情况,请将其写出三次......
/^(?:\d{2}\.\d{2}\.\d{4}|\d{2}\/\d{2}\/\d{4}|\d{2}-\d{2}-\d{4})$/
(或只检查cwolves's wonderful answer。)
你的问题标题是......
Javascript正则表达式验证日期
如果你还需要提取部分,请用括号(()
)包裹它们,这将把它们变成捕获组。如果成功匹配,它们将存储在返回数组的成员中。
答案 1 :(得分:2)
/^\d{2}([.\/-])\d{2}\1\d{4}$/
将匹配01/01/2000
,01.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%严格的健全测试。