2011-09-23 138 views
0

我希望有一個日期格式的正則表達式的特定日期,例如:年1月1 2011正則表達式格式

我已經寫^[0-9]{1,2}-[a-zA-Z]{3}-[0-9]{4},但不檢查對於像50-AAA所有有效日期-2011也將被視爲有效。

我使用Live Validation lib中的JavaScript

我的代碼

var sayDate = new LiveValidation('date'); 
    sayDate.add(Validate.Format, { pattern: /^[0-9]{1,2}-[a-zA-Z]{3}-[0-9]{4}/i }); 

請幫幫忙!

+2

驗證該格式*看起來*右邊是精細使用正則表達式,但使用正則表達式來驗證日期實際上是一個有效的(什麼用閏年,每月的天數不同等),正則表達式是錯誤的。 – Jamiec

+0

[正則表達式匹配有效日期]的可能重複(http://stackoverflow.com/questions/51224/regular-expression-to-match-valid-dates) – Jamiec

+0

你想要多久?你想趕上閏年?其他語言環境如何(「十月」與「Okt」等)? –

回答

1

試圖驗證日期格式使用正則表達式實際上比聽起來複雜得多。你可以很容易地進行基本的驗證,但總有那麼一點點要做到完美。

我會建議改爲使用日期選擇器控件,它可以爲你做驗證(並且還給你一個不錯的閃亮用戶界面功能的獎勵),或者其中一個現有的Javascript庫可以處理日期爲你。

對於日期選取器控件,有任意數量的jQuery選項。對於日期處理庫,我建議查找date.js

希望有所幫助。

+0

'var d1 = Date.parse(dateCut); \t \t \t dateCut = d1。toString('dd-MMM-yyyy');'解決了我的問題。謝謝 – abi1964

1

很明顯,如果您只希望Jan-Dec進行驗證,您需要在RegEx中指定它。然後你必須驗證日期藥水是否正確。然後,該日期是否實際上對於給定的月份或年份有效,並且還有其他許多情況。我相信RegEx不是解決方案。您是否嘗試過使用Date.parse之類的東西,如Datejs

+0

您可以給出任何片段或示例? – abi1964

+0

對不起Abhishek,我沒有使用上述任何一種方法用JavaScript解析日期。但是,如果.NET和其他語言一樣,我會使用'DateTime.Parse'解析日期服務器端。如果不是一個快速和骯髒的解決方案來檢查幾個基本日期解析規則,RegEx不是我會採用的推薦方法。 –

2

如何:

^(0?[1-9]|[1-2][0-9]|3[0-1])-(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)-[1-2][0-9]{3}$ 

這將仍然允許31 - 2月 - 2011所以檢查的日期確實存在,你可能會需要使用其他的東西比一個正則表達式

1

您可以通過JavaScript驗證日期的語法regular expressions。您可以使用Date對象檢查語義,就像這樣:

function ValidateCustomDate(d) { 
    var match = /^(\d{1,2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d{4})$/.exec(d); 
    if (!match) { 
     // pattern matching failed hence the date is syntactically incorrect 
     return false; 
    } 
    var day = parseInt(match[1], 10); // radix (10) is required otherwise you will get unexpected results for 08 and 09 
    var month = { 
     Jan: 0, 
     Feb: 1, 
     Mar: 2, 
     Apr: 3, 
     May: 4, 
     Jun: 5, 
     Jul: 6, 
     Aug: 7, 
     Sep: 8, 
     Oct: 9, 
     Nov: 10, 
     Dec: 11 
    }[match[2]]; // there must be a shorter, simpler and cleaner way 
    var year = parseInt(match[3], 10); 
    var date = new Date(year, month, day); 
    // now, Date() will happily accept invalid values and convert them to valid ones 
    // 31-Apr-2011 becomes 1-May-2011 automatically 
    // therefore you should compare input day-month-year with generated day-month-year 
    return date.getDate() == day && date.getMonth() == month && date.getFullYear() == year; 
} 
console.log(ValidateCustomDate("1-Jan-2011")); // true 
console.log(ValidateCustomDate("01-Jan-2011")); // true 
console.log(ValidateCustomDate("29-Feb-2011")); // false 
console.log(ValidateCustomDate("29-Feb-2012")); // true 
console.log(ValidateCustomDate("31-Mar-2011")); // true 
console.log(ValidateCustomDate("31-Apr-2011")); // false 
+0

感謝您的精彩劇本和解釋。 – abi1964