我对正则表达式不太熟悉。我正在为mm.dd.yyyy,mm/dd/yyyy或mm-dd-yyyy写一个正则表达式。这是我到目前为止,我完全不确定我是否接近。JavaScript正则表达式验证日期
^[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)))$
感谢
我对正则表达式不太熟悉。我正在为mm.dd.yyyy,mm/dd/yyyy或mm-dd-yyyy写一个正则表达式。这是我到目前为止,我完全不确定我是否接近。JavaScript正则表达式验证日期
^[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)))$
感谢
/^\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正则表达式验证日期
如果您还需要提取部分,用圆括号(()
)包装它们,这将使它们变成捕获组。如果匹配成功,它们将存储在返回数组的成员中。
@ alex:我到底在哪里放?谢谢! – willis0924 2011-04-25 03:41:43
@willis你可以像'dateStr.match(/ regex-here /)'那样使用它。如果它返回'null',则不匹配。 – alex 2011-04-25 03:44:40
'/^\ d {2}([\/- ])\ d {2} \ 1 \ d {4} $ /' 不需要对第二示例。 – 2011-04-25 03:55:19
在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
做=)
我不喜欢每一次重复该图案为.
,-
和/
试一下像下面:
^(\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')
这不是完全严格。例如,它将成功解析2/30/2011为有效。尽管如此,这是一个很好的99%的严格测试。
@Dave沃德:我不是想要你的答案牛奶,但你能写出来的全部,我不是那样理解它?谢谢 – willis0924 2011-04-25 04:02:10
你确定这可以吗? '变种d = Date.parse( “2011年4月24日”);''给NaN' – manojlds 2011-04-25 04:03:19
@manojlds:是的,我测试了所有那些在控制台上,然后再发布。如果浏览器的语言环境不是使用mm/dd/yyyy日期的语言环境,则可能无法正常工作。 – 2011-04-25 04:19:34
我已经看到了一些怪物正则表达式匹配实际dates-他们不会匹配4月31日/ YYYY,例如,或2011年2月29日。
这是简单的,力图使从输入一个日期,然后检查输入。
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
*/
这是迄今为止我见过的最好的。精心打造。 – vsync 2011-11-14 12:07:58
@kennebec已与一个完美的解决方案比一个正则表达式更好的提供了你,你应该接受他的答案。 – vsync 2011-11-16 09:40:28