一、簡單的日期判斷(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值類
型表示值範圍
在公元(**紀元)
2023年1
月1日午夜12:00:00
到公元(c.e.)2023年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])00
2.
最強驗證
日期的正
則表示式
,新增了閏年的
驗證
這個日期正
則表示式支援
yyyy-mm-dd
yyyy/mm/dd
yyyy_mm_dd
yyyy.mm.dd
的形式match :
2008-2-292008/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)))
正規表示式大全
0 9 1 9 0 9 正整數 d 0 非正整數 負整數 0 0 9 1 9 0 9 負整數 d 整數 d d 非負浮點數 正浮點數 0 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 正浮點數 d d 0 0 非正浮點數 負浮點數 0 0 9 0 9 1 9...
正規表示式大全
d d d b end function c string mdytodmy string input d d b regex 替換模式 本示例說明如何在 regex.replace 的替換模式中使用命名的反向引用。其中,替換表示式 插入由 組捕獲的子字串。有幾種靜態函式使您可以在使用正規表示式操作...
正規表示式大全
專案推薦 推薦個人github開源專案 iot dc3 乙個開源的 分布式的物聯網 iot 平台,用於快速開發物聯網專案和管理拓展。匹配中文字元的 u4e00 u9fa5 匹配雙位元組字元 x00 xff 匹配空白行 ns r 匹配email w w w w w w 匹配 a za z s 匹配賬號...