2011-04-25 142 views
0

我对正则表达式不太熟悉。我正在为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)))$ 

感谢

+0

@kennebec已与一个完美的解决方案比一个正则表达式更好的提供了你,你应该接受他的答案。 – vsync 2011-11-16 09:40:28

回答

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正则表达式验证日期

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

+0

@ alex:我到底在哪里放?谢谢! – willis0924 2011-04-25 03:41:43

+0

@willis你可以像'dateStr.match(/ regex-here /)'那样使用它。如果它返回'null',则不匹配。 – alex 2011-04-25 03:44:40

+0

'/^\ d {2}([\/- ])\ d {2} \ 1 \ d {4} $ /' 不需要对第二示例。 – 2011-04-25 03:55:19

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做=)

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

将匹配01/01/200001.01.2000,NOT 01/01.2000

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

不相同,而包裹这三个日期部分。

+0

+1教我的东西。 – alex 2011-04-25 04:02:14

+0

所以'\ 1'引用第一组?我想了解,谢谢 – Pablo 2013-01-03 17:24:48

+0

这也将验证真正的98/42/2343,这不是一个真正的日期 – TMQuinn 2013-10-15 16:42:44

0

我不喜欢每一次重复该图案为.-/

试一下像下面:

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

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

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%的严格测试。

+0

@Dave沃德:我不是想要你的答案牛奶,但你能写出来的全部,我不是那样理解它?谢谢 – willis0924 2011-04-25 04:02:10

+0

你确定这可以吗? '变种d = Date.parse( “2011年4月24日”);''给NaN' – manojlds 2011-04-25 04:03:19

+0

@manojlds:是的,我测试了所有那些在控制台上,然后再发布。如果浏览器的语言环境不是使用mm/dd/yyyy日期的语言环境,则可能无法正常工作。 – 2011-04-25 04:19:34

2

我已经看到了一些怪物正则表达式匹配实际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 

*/

+0

这是迄今为止我见过的最好的。精心打造。 – vsync 2011-11-14 12:07:58