時間正則式的表示

2021-08-25 13:52:40 字數 1436 閱讀 5587

轉至:

最簡單的正則 如 : \d-\d-\d

但是實際情況卻不是那麼簡單,,要考慮,有效性和閏年等問題.....

對於日期的有效範圍,不同的應用場景會有所不同。msdn中定義的datetime物件的有效範圍是:0001-01-01 00:00:00到9999-12-31 23:59:59。

unix時間戳的0按照iso 8601規範為 :1970-01-01t00:00:00z。

先考慮與年份無關的前三條規則,年份可統一寫作

(?!0000)[0-9]

下面僅考慮月和日的正則

1. 包括平年在內的所有年份的月份都包含1-28日

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

2. 包括平年在內的所有年份除2月外都包含29和30日

(0[13-9]|1[0-2])-(29|30)

3. 包括平年在內的所有年份1、3、5、7、8、10、12月都包含31日

(0[13578]|1[02])-31)

合起來就是除閏年的2月29日外的其它所有日期

(?!0000)[0-9]-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)

接下來考慮閏年的實現

1 : 四年一閏

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

2 : 百年不閏,四百年再閏

(0[48]|[2468][048]|[13579][26])00

3 : 合起來就是所有閏年的2月29日

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

四條規則都已實現,且互相間沒有影響,合起來就是所有符合datetime範圍的日期的正則

^((?!0000)[0-9]-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9](0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$

考慮到這個正規表示式僅僅是用作驗證,所以捕獲組沒有意義,只會占用資源,影響匹配效率,所以可以使用非捕獲組來進行優化。

^(?:(?!0000)[0-9]-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9](?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

正則表示小記

re中一般用 區分自定義字元,這個與在字元傳中相同的字母和目的的字串衝突,e.g.用來表示 因為每個 都是 解決方法 re中用r表示raw string.也就是說r n 代表 和 n 這兩個字元 re.escape pattern 忽略在pattern中的某些特定的字元,也就是說不包含metacha...

rails 表示時間

time time.now time time.now time 得到當前本地時間,thu jun 07 01 04 38 0800 2007 time 得到當前本地時間,thu jun 07 01 04 38 0800 2007 time.gmtime 得到格林威治時間,wed jun 06 17...

時間序列表示

自然界的資料型別 用於神經網路處理 大致可分為兩種,一種是未知相關的資料 如卷積神經網路中處理的二維 另一種叫做序列訊號 也可以理解為時間軸上的資料 比如一段語音,就是乙個序列訊號,因為它的資料之間有乙個時間的先後順序 再比如聊天記錄,它可能並不是乙個時間序列,但是我們閱讀的時候會有乙個先後順序。這...