最簡單的正則 如 : \d{4}-\d{2}-\d{2} 可是實際狀況卻不是那麼簡單,,要考慮,有效性和閏年等問題..... 對於日期的有效範圍,不一樣的應用場景會有所不一樣。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]{4} 下面僅考慮月和日的正則 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. 包括平年在內的全部年份一、三、五、七、八、十、12月都包含31日 (0[13578]|1[02])-31) 合起來就是除閏年的2月29日外的其它全部日期 (?!0000)[0-9]{4}-((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]{2}(0[48]|[2468][048]|[13579][26]) 2 : 百年不閏,四百年再閏 (0[48]|[2468][048]|[13579][26])00 3 : 合起來就是全部閏年的2月29日 ([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29) 四條規則都已實現,且互相間沒有影響,合起來就是全部符合DateTime範圍的日期的正則 ^((?!0000)[0-9]{4}-((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]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$ 考慮到這個正則表達式僅僅是用做驗證,因此捕獲組沒有意義,只會佔用資源,影響匹配效率,因此能夠使用非捕獲組來進行優化。 ^(?:(?!0000)[0-9]{4}-(?:(?: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]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$