正如其他地方提到的那样,正则表达式几乎肯定不是您想要的。但是,话虽如此,如果您真的需要一个正则表达式,这就是它的构建方式:
31天月份
(0[13578]|1[02])[\/.](0[1-9]|[12][0-9]|3[01])[\/.](18|19|20)[0-9]{2}
30天的月份
(0[469]|11)[\/.](0[1-9]|[12][0-9]|30)[\/.](18|19|20)[0-9]{2}
2月1日至28日始终有效
(02)[\/.](0[1-9]|1[0-9]|2[0-8])[\/.](18|19|20)[0-9]{2}
闰年的2月29日也是合法的。
(02)[\/.]29[\/.](((18|19|20)(04|08|[2468][048]|[13579][26]))|2000)
这意味着如果你把所有东西都放在一起,它将是这样的:
((0[13578]|1[02])[\/.](0[1-9]|[12][0-9]|3[01])[\/.](18|19|20)[0-9]{2})|((0[469]|11)[\/.](0[1-9]|[12][0-9]|30)[\/.](18|19|20)[0-9]{2})|((02)[\/.](0[1-9]|1[0-9]|2[0-8])[\/.](18|19|20)[0-9]{2})|((02)[\/.]29[\/.](((18|19|20)(04|08|[2468][048]|[13579][26]))|2000))
这个版本稍微短一些,但是理解起来可能会有一点困难。
((0[13578]|1[02])[\/.]31[\/.](18|19|20)[0-9]{2})|((01|0[3-9]|1[1-2])[\/.](29|30)[\/.](18|19|20)[0-9]{2})|((0[1-9]|1[0-2])[\/.](0[1-9]|1[0-9]|2[0-8])[\/.](18|19|20)[0-9]{2})|((02)[\/.]29[\/.](((18|19|20)(04|08|[2468][048]|[13579][26]))|2000))
这些脚本很长且难以维护。显然这不是个好主意,但仍然有可能实现。
注意事项:
- 年份范围为 1800-2099(可以方便地添加更多范围,但需要在 4-6 个不同的地方进行更改)
- 要求月份和日期必须是两位数字(可以在 ~8 个地方放宽限制)
[\/.]
作为分隔符(8 个地方)
- 没有经过测试(我们可以检查所有数字组合并与 JavaScript 的日期函数进行比较吗?[证明我们正在重新发明轮子])
Date
类? - Demian Brecht