我試圖驗證使用正則表達式的日期日期驗證的一部分(這是對正則表達式的家庭作業 - 是的,我知道有更好的方法使用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是在本月 (假設沒有閏年檢查)
我怎樣才能將這張支票添加到我的表情中?
我試圖驗證使用正則表達式的日期日期驗證的一部分(這是對正則表達式的家庭作業 - 是的,我知道有更好的方法使用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是在本月 (假設沒有閏年檢查)
我怎樣才能將這張支票添加到我的表情中?
對於格式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}$
討厭的正則表達式。
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;
更新
不要使用正則表達式來驗證日期!這個問題是典型的無稽之談,但我接受了這個挑戰。
還要注意,這個正則表達式不是你能想到的最好的,但它很清晰和簡單。
考慮到編譯和解析時間,它比預測的要快得多。
只是不要使用正則表達式。 – 2014-09-12 21:41:25
通過不使用不可維護的正則表達式,而是編寫一些簡單的代碼。 – 2014-09-12 21:41:34
這是作業,我需要使用正則表達式 – Joly 2014-09-12 21:42:19