我對正則表達式不太熟悉。我正在爲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