最強日期驗證

2021-06-28 22:06:16 字數 4111 閱讀 2643

一、簡單的日期判斷(yyyy/mm/dd): 

^\d(\-|\/|\.)\d\1\d$

二、演化的日期判斷(yyyy/mm/dd| yy/mm/dd): 

^(^(\d|\d)(\-|\/|\.)\d\3\d$)|(^\d年\d

月\d日$)$

三、加入閏年的判斷的:

例項:^((((1[6-9]|[2-9]\d)\d)-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d)-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d)-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$

分析:1、什麼是合法的日期範圍?對於不同的應用場景,這個問題有不同的解釋。這裡採納msdn中的約定:

datetime

值型別表示值範

圍在公元(**紀元)

0001 年1 

月1 日午夜12:00:00 

到公元(c.e.) 9999 

年12 

月31 日晚

上11:59:59 之間

的日期和時間。

2、關於閏年的闡釋。關於公

歷閏年是

這樣規定的:地球

繞太陽公

轉一周叫做一回

歸年,一回歸年

長365日5

時48分46

秒。因此,公

歷規定有平年和

閏年,平年一年有

365日,比回歸年短

0.2422

日,四年共短

0.9688

日,故每

四年增加一日,

這一年有

366日,就是閏

年。但四年增加一日比四個回

歸年又多

0.0312

日,400

年後將多

3.12日,

故在400

年中少設3個

閏年,也就是在

400年中只設97

個閏年,這

樣公曆年的平均

長度與回

歸年就相近似了。由此

規定:年份是整百數的必須是

400的倍數才是

閏年,例如

1900

年、2100

年就不是閏年

。 首先需要

驗證年份,

顯然,年份範

圍為0001 - 9999

,匹配yyyy的正則

表示式為:

[0-9][1-9]|[0-9][1-9][0-9]|[0-9][1-9][0-9]|[1-9][0-9]

其中 [0-9] 也可以表示為 \d,但 \d 不如 [0-9] 直觀,因此下面我將一直採用 [0-9]

用正規表示式驗證日期的難點有二:一是大小月份的天數不同,二是閏年的考慮。

對於第乙個難點,我們首先不考慮閏年,假設2月份都是28天,這樣,月份和日期可以分成三種情況:

1、月份為 1, 3, 5, 7, 8, 10, 12,天數範圍為 01 - 31,匹配mm-dd的正規表示式為:

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

2、月份為 4, 6, 9, 11,天數範圍為 01-30,匹配mm-dd的正規表示式為:

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

3、月份為 2,考慮平年情況,匹配mm-dd的正規表示式為:

02-(0[1-9]|[1][0-9]|2[0-8])

根據上面的成果,我們可以得到匹配平年日期格式為yyyy-mm-dd的正規表示式:

([0-9][1-9]|[0-9][1-9][0-9]|[0-9][1-9][0-9]|[1-9][0-9])-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))

接著我們來解決第二個難點:閏年的考慮。根據閏年的定義,我們可以將閏年分為兩類:

1、能被4整除但不能被100整除的年份。尋找後兩位的變化規律,可以很快得到下面的正則匹配:

([0-9])(0[48]|[2468][048]|[13579][26])

2、能被400整除的年份。能被400整除的數肯定能被100整除,因此後兩位肯定是00,我們只要保證前兩位能被4整除即可,相應的正規表示式為:

(0[48]|[2468][048]|[3579][26])002.最

強驗證日期的正

則表示式

,新增了閏年的

驗證 這個日期正規表示式支援

yyyy-mm-dd

yyyy/mm/dd

yyyy_mm_dd

yyyy.mm.dd

的形式match : 

2008-2-29 2008/02/29

not match : 

2008-2-30   2007-2-29

完整的正

則表示式如下:

((^((1[8-9]\d)|([2-9]\d))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d)|([2-9]\d))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d)|([2-9]\d))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([3579][26]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))閏年的

2月份有

29天,因此匹配

閏年日期格式

為yyyy-mm-dd的正則

表示式為

:(([0-9])(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29

最後,將平年和

閏年的日期

驗證表示式合併,我

們得到最終的

驗證日期格式

為yyyy-mm-dd的正則

表示式為

:(([0-9][1-9]|[0-9][1-9][0-9]|[0-9][1-9][0-9]|[1-9][0-9])-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9])(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)

dd/mm/yyyy格式的正則驗證表示式為

:(((0[1-9]|[12][0-9]|3[01])/((0[13578]|1[02]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|(0[1-9]|[1][0-9]|2[0-8])/(02))/([0-9][1-9]|[0-9][1-9][0-9]|[0-9][1-9][0-9]|[1-9][0-9]))|(29/02/(([0-9])(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00)))

最強驗證日期的正規表示式

validationexpression 1 8 9 d 2 9 d 10 12 0?13578 3 01 12 0 9 0?1 9 1 8 9 d 2 9 d 11 0?469 30 12 0 9 0?1 9 1 8 9 d 2 9 d 0?2 2 0 8 1 0 9 0?1 9 2468 048...

日期格式驗證

日期格式yyyymmdd正規表示式 var reg 0 9 1 9 0 9 1 9 0 9 0 9 1 9 0 9 1 9 0 9 0 13578 10 12 0 1 9 1 0 9 2 0 9 3 01 0 469 11 0 1 9 1 0 9 2 0 9 30 02 0 1 9 1 0 9 2 ...

最強日期正規表示式

一 簡單的日期判斷 yyyy mm dd d d 1 d 二 演化的日期判斷 yyyy mm dd yy mm dd d d d 3 d d年 d 月 d日 三 加入閏年的判斷的 例項 1 6 9 2 9 d d 0?13578 1 02 0?1 9 12 d 3 01 1 6 9 2 9 d d ...