2014-09-12 20 views
-1

我試圖驗證使用正則表達式的日期日期驗證的一部分(這是對正則表達式的家庭作業 - 是的,我知道有更好的方法使用API​​在Java中這樣做)驗證2月份使用正則表達式

到目前爲止,我管理下面的表達式:

(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/((18|19|20|21)\\d\\d) 

我想補充支票二月,即不能有30及31天2是在本月 (假設沒有閏年檢查)

我怎樣才能將這張支票添加到我的表情中?

+6

只是不要使用正則表達式。 – 2014-09-12 21:41:25

+0

通過不使用不可維護的正則表達式,而是編寫一些簡單的代碼。 – 2014-09-12 21:41:34

+0

這是作業,我需要使用正則表達式 – Joly 2014-09-12 21:42:19

回答

2

對於格式DD/MM/YYYY

^(?:(?:[12][0-9]|0?[1-9])/0?2|(?:30|[12][0-9]|0?[1-9])/(?:0?[469]|11)|(?:3[01]|[12][0-9]|0?[1-9])/(?:0?[13578]|1[02]))/[0-9]{4}$ 

唯一的問題與此正則表達式是,它將匹配每年的2月29日。


這個正則表達式包括:

(?:[12][0-9]|0?[1-9])/0?2 

這部分改掉,以匹配正確的日期和月份,如果月份是2月。 (從一日到二月29日)


如果一個月不二月嘗試匹配:

(?:30|[12][0-9]|0?[1-9])/(?:0?[469]|11) 

這部分改掉,以每個月都會有30天相匹配。 (這是4,6,9和11個月)(從1月1日到30日)。


如果月份也不是四月,六月,九月,或十一月

(?:3[01]|[12][0-9]|0?[1-9])/(?:0?[13578]|1[02]) 

這部分改掉到一個月匹配(1,3,5,7,8,10和12)


最後一部分:[0-9]{4}符合年份。 (每4位數字)


如果你想只匹配到今年二月利用28日的正則表達式:

^(?:(?:1[0-9]|2[0-8]|0?[1-9])/0?2|(?:30|[12][0-9]|0?[1-9])/(?:0?[469]|11)|(?:3[01]|[12][0-9]|0?[1-9])/(?:0?[13578]|1[02]))/[0-9]{4}$ 

如果你想在正則表達式匹配只能做到月28日DD/MM/YYYY與所需的前導零,如果低於2個位數(你只需要替換所有0 0?)

^(?:(?:1[0-9]|2[0-8]|0[1-9])/02|(?:30|[12][0-9]|0[1-9])/(?:0[469]|11)|(?:3[01]|[12][0-9]|0[1-9])/(?:0[13578]|1[02]))/[0-9]{4}$ 
+0

我會用'[1-9] [0-9 ] *'一年 - 看不到任何理由爲什麼我們應該限制它 – Deltharis 2014-09-12 22:08:57

+0

這樣更好!請你能解釋一下嗎? – Joly 2014-09-12 22:11:44

+0

如何將此更改爲僅接受2月28日的請求,讓我們假設不檢查閏年? – Joly 2014-09-12 22:48:47

0

討厭的正則表達式。

String days30 = "(0{0,1}[1-9]|[12][0-9]|30)"; 
    String days31 = "(0{0,1}[1-9]|[12][0-9]|3[01])"; 
    String days28 = "(0{0,1}[1-9]|1[0-9]|2[0-8])"; 
    String month30 = "(0{0,1}(4|6|9)|11)"; 
    String month31 = "(0{0,1}(1|3|5|7|8)|1(0|2))"; 
    String years = "(17|18|19|20)\\d\\d"; 
    String dateExpr = "((" + days30 + "/" + month30 + ")|(" + days31 + "/" + month31 + ")|(" + days28 + "/02))/" + years; 

更新

不要使用正則表達式來驗證日期!這個問題是典型的無稽之談,但我接受了這個挑戰。

還要注意,這個正則表達式不是你能想到的最好的,但它很清晰和簡單。

考慮到編譯和解析時間,它比預測的要快得多。

+0

天= 00會通過。我認爲你的意思是'days28'而不是'days24'。此外,您需要額外的一套「年」來適用於所有的月/日期選項,而不僅僅是最後一項。 – 2014-09-12 22:07:26

+0

'days24'?但我明白了... – Betlista 2014-09-12 22:08:09

+0

修正了它......第二天早上。 – Hannes 2014-09-13 05:13:34