正則表達式 日期匹配 閏年平年html
須要對日期進行一個正則表達式匹配,想要找出一個可以匹配全部狀況的正則表達式。
網上這篇博客【http://www.cnblogs.com/jay-xu33/archive/2009/01/08/1371953.html
】說得挺不錯的,你們能夠借鑑參考。正則表達式
年份主要是有平年和閏年之別,平年有365天,閏年有366天。.net
爲何平年有365天和閏年有366天,而不是其餘數字?code
(1)首先,地球繞太陽公轉一週的時間長度稱爲【一回歸年】。一回歸年換算成時間長度就是365天5時48分46秒,即365.02422天。爲了方便,就取整數365天做爲平年的天數。這裏就說明了數字【365】的來源。 (2)平年一年有365日,比一回歸年短0.2422日,四年共短0.9688日(約等於1),因此每4年增長1日,這一年有366日,就是閏年這裏就解釋了數字【366】的來源。 (3)閏年定義:上面說到每4年增長1日,這年有366天就是閏年。但每4年增長1日,這樣年份天數比4個迴歸年又多0.0312日,400年後將多3.12日,故在400年中少設3個閏年,也就是在400年中只設97個閏年(若是按照原來每4年就有一個閏年的計算方式,則400年就有100個閏年),這樣公曆年的平均長度與迴歸年就相近似了。由此規定:年份是整百數的必須是400的倍數纔是閏年,例如1300年不是閏年,1200年是閏年。
由此可知,4個年份數字(yyyy)知足【能被400整除】或【被4整除且不能被100整除】兩個條件之一的,那一年就是閏年。其餘年份就是平年。htm
常見的合法日期時間在一個有效範圍內,這裏咱們取【0001年01月01日 00時00分00秒】到【9999年12月31日 23時59分59秒】。blog
(1)全部年份是從0001到9999,要注意不能出現四個數字同時爲0的狀況,即不能出現0000年,這是非法的年份數字。一個數字能夠用\d或[0-9]表示。get
全部年份正則表達式: [0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}
(2)閏年
根據閏年的定義將閏年分爲兩類:博客
([0-9]{2})(0[48]|[2468][048]|[13579][26])
(0[48]|[2468][048]|[13579][26])00
日期主要就是每月的天數不一樣,比較特殊的就是2月,平年2月28天,閏年2月有29天。其餘月份在平年和閏年沒有區別。it
(1)月份爲 1, 3, 5, 7, 8, 10, 12,天數範圍爲 01 - 31,正則表達式爲:class
(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])
(2)月份爲 4, 6, 9, 11,天數範圍爲 01-30,正則表達式爲:
(0[469]|11)-(0[1-9]|[12][0-9]|30)
(3)月份爲 2,平年時的正則表達式爲:
02-(0[1-9]|[1][0-9]|2[0-8])
閏年時只要特意匹配29日那天便可,由於其餘的日子均可以在平年的表達式裏面匹配到,故爲:
02-29
^((([0-9]{2})(0[48]|[2468][048]|[13579][26])) #閏年,能被4整除但不能被100整除 |((0[48]|[2468][048]|[13579][26])00) #閏年,能被400整除 -02-29) #匹配閏年2月29日這一天。若是不是這一天,則由下面式子繼續匹配驗證。 |([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}) #平年(0001-9999) -(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])) #月日,一、三、五、七、八、十、12月有31天 |((0[469]|11)-(0[1-9]|[12][0-9]|30)) #月日,四、六、九、11月有30天 |(02-(0[1-9]|[1][0-9]|2[0-8]))) #平年2月只有28天,月日表示爲【02-01至02-28】
PS:若是還有加上時間的驗證,那麼就在上面日期的基礎上加上【HH:mm:ss】的考慮。小時分爲【00-12】或【00-23】兩種狀況,時間和分鐘都是【00-59】。
參考文章:
http://www.cnblogs.com/jay-xu33/archive/2009/01/08/1371953.html
http://www.jb51.net/article/20753.htm
http://www.cnblogs.com/bit-by-bit/p/6703355.html
http://www.cnblogs.com/wyxy_czj/articles/1958221.html