2012-03-02 67 views
0

我需要一個正則表達式來驗證日期(包括閏年)在MMM DD yyyy格式
我發現了一個正則表達式,但它目前的bug,在2月29日的每個閏年
MMM dd yyyy驗證正則表達式?

^(?:(((January|March|May|July|August|October|December) 31)|((January|March|April|May|June|July|August|September|October|November|December) (([0-2]\\d)|30))|(February ([01]\\d|2[0-8])))|(February 29(?=-((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))) ((1[6-9]|[2-9]\\d)\\d{2})$ 

請幫我修理它。
預先感謝

+3

接觸到的第一個問題是:爲什麼你需要正則表達式?沒有可以驗證日期的類嗎?不要重新發明輪子。順便說一句,你的正則表達式將接受4月00 6787.你真的想用正則表達式來驗證,如果2月29日,那麼'year%4 == 0 &&(year%100!= 0 || year%400 == 0)'? – Benoit 2012-03-02 10:54:34

+0

你使用jQuery日期選擇器嗎? – 2012-03-02 10:59:17

回答

2

這裏的檢查日期字符串的有效性的功能,考慮格式也:

function chkdate(datestr,formatstr){ 
    if (!(datestr && formatstr)) {return false;} 
    var splitter = formatstr.match(/\-|\/|\s/) || ['-'] 
     ,df = formatstr.split(splitter[0]) 
     ,ds = datestr.split(splitter[0]) 
     ,ymd =[0,0,0] 
     ,dat; 
    for (var i=0;i<df.length;i++){ 
      if (/yyyy/i.test(df[i])) {ymd[0] = ds[i];} 
     else if (/mm/i.test(df[i])) {ymd[1] = ds[i];} 
     else if (/dd/i.test(df[i])) {ymd[2] = ds[i];} 
    } 
    dat = new Date(ymd.join('/')); 
    return !isNaN(dat) && Number(ymd[1])<=12 && dat.getDate()===Number(ymd[2]); 
} 
//usage (in your case) 
var months = {january:1,february:2,march:3,april:4,may:5, 
       june:6,july:7,august:8,september:9,october:10, 
       november:11,december:12}, 
inputdateraw = 'february 29 2011'.split(' '), 
inputdate = [months[inputdateraw[0]], 
      inputdateraw[1], 
      inputdateraw[2]].join(' '); 
console.log(chkdate (inputdate, 'mm dd yyyy')); //=> false 

參見this SO-question

+0

非常感謝 – Dranix 2012-03-03 16:36:02

1

如果您使用的是jQuery,那麼您可以使用隨附的date picker

或者你可以使用驗證插件。你可以使用addMethod函數來定製它。

$.validator.addMethod(
    "australianDate", 
    function(value, element) { 
     // put your own logic here, this is just a (crappy) example 
     return value.match(/^\d\d?\/\d\d?\/\d\d\d\d$/); 
    }, 
    "Please enter a date in the format dd/mm/yyyy" 
); 

然後在窗體上:

$('#myForm') 
    .validate({ 
     rules : 
      myDate : { 
       australianDate : true 
      } 
    }); 

here

也有是一個JavaScript日期庫 - Datejs

+0

我也使用addMethod函數,我需要一個正則表達式來驗證手動輸入的用戶輸入,而不是通過datepicker。 Datejs是非常酷的網站。謝謝你的回答。 – Dranix 2012-03-03 16:35:13

+0

使用DateJS,你可以試圖解析字符串值。如果返回Date對象,則您有一個有效的Date。如果返回'null',則該字符串不能轉換爲Date對象。示例... var isDate =(Date.parse(value)=== null); – 2012-03-04 01:26:39

1

你能試着用這個代碼,而不是:

"^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?)\\ 31)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|Sep(tember)?|(Nov|Dec)(ember)?)\\ (0?[1-9]|([12]\\d)|30))|(Feb(ruary)?\\ (0?[1-9]|1\\d|2[0-8]|(29(?=,\\ ((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))))\\,\\ ((1[6-9]|[2-9]\\d)\\d{2}))" 
+0

'Ma(r(ch)?| y)'匹配「Mary」,用'Ma((r(ch)?)| y)'代替 – 2016-07-06 19:02:30

1

您可以使用瞬間的js庫,它提供了強大的內置函數。 Refer this fiddle工作示例。

var date = "Mar 23 2001"; 
var indate = "Feb 29 2001"; 

moment(date,"MMM DD YYYY").isValid(); // true 
moment(indate,"MMM DD YYYY").isValid(); // false 
相關問題