2011-04-25 127 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