显然,正则表达式不是执行此操作的理想方式。此外,使用YYYY-MM-DD(ISO 8601) 格式更安全,而不是MM/DD/YYYY.
也就是说,这里是从 1800 年 1 月 1 日到 2099 年 12 月 31 日的最短完整正则表达式:
^(((0[1-9]|1[012])\/(?!00|29)([012]\d)|(0[13-9]|1[012])\/(29|30)|(0[13578]|1[02])\/31)\/(18|19|20)\d{2}|02\/29\/((18|19|20)(0[48]|[2468][048]|[13579][26])|2000))$
长度:162 个字符。
分解:
^ # start
(
( # non-leap months & days
(0[1-9]|1[012])/(?!00|29)([012]\\d) # all months, days 01-28, uses negative lookahead
|
(0[13-9]|1[012])/(29|30) # all months except feb, days 29,30
|
(0[13578]|1[02])/31 # all 31 day months, day 31 only
)
/
(18|19|20)\\d{2} # all years
|
02/29 # leap day
/
(
(18|19|20)(0[48]|[2468][048]|[13579][26]) # leap years not divisible by 100
|
2000 # leap years divisible by 100
)
)
$ # end
这是一个测试从 00/00/1800 到 99/99/2099 的所有用例的小提琴。
此外,为了更有趣,这里有另一个小提琴,它生成了最糟糕的正则表达式,但仍然有效,长度为 1205306 个字符。它看起来像这样:
^(01/01/1800|01/02/1800|01/03/1800|...|12/29/2099|12/30/2099|12/31/2099)$