2017-01-16 116 views
0

我目前使用以下正則表達式從http://regexlib.com使用模式YYYY-MM-DD驗證傳入日期。但是,前導零是強制性的,我希望它是可選的。日期驗證正則表達式 - 使前導零可選

((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8])))) 

Regular expression visualization

Debuggex Demo

Test case

2000-01-01 
2000-1-1 
2000-01-1 
2000-1-01 

都是有效的。但截至目前,只有第一個測試案例被接受。

你能幫忙嗎?

+0

只需使用一個簡單的regex - '\ d {4} - \ d {1,2} - \ d {1,2}' – Philipp

+0

不要在使用正則表達式所有,請參閱[*如何驗證日期?*](http://stackoverflow.com/questions/5812220/how-to-validate-a-date/5812341#5812341)。 – RobG

回答

1

你可以更簡單地使用函數而不是正則表達式來實現這一點。以下內容更易於理解和維護(儘管它不需要任何),並且OP中的正則表達式的代碼少得多。

function isValidISODate(s) { 
 
    var b = s.split(/\D/); 
 
    var d = new Date(b[0],--b[1],b[2]); 
 
    return d && d.getMonth() == b[1]; 
 
} 
 

 
// Some tests 
 
['2016-1-1','2016-01-01','2016-2-29','2016-02-30'].forEach(
 
    s=>console.log(s + ': ' + isValidISODate(s)) 
 
);

0

您可以通過添加允許的出價次數{0,1}來創建一個可選的數字。也就是說{1,2}能夠接受1個字符或2

一個簡單的版本:

[0-9]{4}-[0-9]{1,2}-[0-9]{1,2} 

編輯:你的版本是很容易「修復」。

// Before. 
((((0[13578] 
// After. 
((((0{0,1}[13578] 

EDIT2:簡單地強制0後添加{0,1}正如@Toto所說{0,1}相同?

((((0?[13578] 
+2

我認爲這是一個更復雜的正則表達式,不僅檢查YYYY-MM-DD格式,而且實際檢查它是否是合法的日期。 –

+0

@Someone編輯反映結果與他的版本 – zurfyx

+0

'0?'是一樣的'0 {0,1}'和更可讀 – Toto

0

使用此正則表達式 - 「\ d + - [0-2] * [0-9] - [0-3] * [0-9]'可能會有幫助。

+0

不,這個正則表達式允許年與無限的數字,但月和日穆斯特有兩個字符 - 這是完全不是他想要的 – Philipp

+0

你回答什麼問題? – Toto