1. 程式人生 > >驗證日期的Java正則表示式

驗證日期的Java正則表示式

閒著沒事的時候,寫了個驗證日期的正則表示式,弄了大半天,頭都大了。由於使用到了反向預搜尋模式“(?<=)”和“(?<!)”,所以這個只能在 Java 中使用,不能在 JavaScript 中使用,JavaScript 不支援反向預搜尋。支援 yyyy-MM-dd、yyy-MM-dd、yy-MM-dd 和 y-MM-dd,即年份為 1~4 位數字,範圍(1~9999,不存在公元 0 年),月和日應為兩位數字(月和日要為一位數字的話還需要稍微修改一下),分隔符為“-”(凡是分隔符的地方都加上了註釋,可以改成其他的字元)。

下面是原始碼:

上面的版本中僅適用於除錯和修改,去掉空格、註釋和換行後的精簡模式如下,有 266 個字元(有誤,2010-05-17刪):

(?:[0-9]{1,4}(?<!^0?0?0?0))-(?:0?[1-9]|1[0-2])-(?:0?[1-9]|1[0-9]|2[0-8]|(?:(?<=(?:0?[13578]|1[02])-)(?:29|3[01]))|(?:(?<=(?:0?[469]|11)-)(?:29|30))|(?:(?<=(?:(?:[0-9]{0,2}(?!0?0)(?:[02468]?(?<![13579])[048]|[13579][26]))|(?:(?:[02468]?[048]|[13579][26])00))-02-)(?:29)))

(2010-05-17 修)更新後為 273 個字元:

(?:[0-9]{1,4}(?<!^0?0?0?0))-(?:0?[1-9]|1[0-2])-(?:0?[1-9]|1[0-9]|2[0-8]|(?:(?<=-(?:0?[13578]|1[02])-)(?:29|3[01]))|(?:(?<=-(?:0?[469]|11)-)(?:29|30))|(?:(?<=(?:(?:[0-9]{0,2}(?!0?0)(?:[02468]?(?<![13579])[048]|[13579][26]))|(?:(?:[02468]?[048]|[13579][26])00))-0?2-)(?:29)))