日誌正規表示式

2021-07-29 19:51:04 字數 4138 閱讀 8377

一、簡單的日期判斷(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])00 2.

最強驗證

日期的正

則表示式

,新增了閏年的

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

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)))

正規表示式清理日誌

字段提取中正規表示式的使用 提取日誌中的資訊格式 欄位名稱 匹配具體資訊的正規表示式 日誌樣例 78 2019 08 21t17 10 01.461970 08 00 localhost crond root cmd usr lib64 sa sa1 1 1 正規表示式 d s s s s s s ...

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 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 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...