正则表达式 \|闰年等等

新手上路,请多包涵

我最近一直在寻找一个正则表达式来做一些客户端日期检查,但我一直无法找到一个可以满足以下条件的表达式:

  • 范围从 1800 到现在
  • 使用闰年执行正确的日期检查
  • MM/DD/YYYY 表格
  • 无效日期检查

(这些限制超出了我的范围,并且是客户的要求,尽管我努力说服他们这不是最佳途径)

当前代码:

 $('input').keyup(function()
{
       var regex = /^(?:(0[1-9]|1[012])[\/.](0[1-9]|[12][0-9]|3[01])[\/.](18|19|20)[0-9]{2})$/;
       $(this).toggleClass('invalid',!regex.test($(this).val()));
});

更新:

我应该指出,这主要是为了看看是否可以使用这样的正则表达式( _因为在这件事上我不选择使用正则表达式_)。我知道用于验证日期的其他( _和更好_)选项,但是如前所述 - 这是为了查看是否可以通过正则表达式。

原文由 Rion Williams 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 312
2 个回答

正如其他地方提到的,正则表达式几乎肯定不是你想要的。但是,话虽如此,如果您真的想要一个正则表达式,那么它的构建方式如下:

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 个不同的地方进行更改)
  • 需要 2 位数的月份和日期(可以从大约 8 个地方的表达式中删除严格性)
  • [\/.] 作为分隔符(8 个位置)
  • 尚未经过测试(我们可以根据所有数字组合检查它并与 javascript 日期函数进行比较?[证明我们正在重新发明轮子])

原文由 McKay 发布,翻译遵循 CC BY-SA 3.0 许可协议

我建议您放弃为此使用正则表达式的尝试。最好将日期解析为它的组成部分(月、日、年),然后使用数字比较来确保它在正确的范围内。

更好的是,看看 Javascript Date.parse 函数是否会执行您想要的操作。

用正则表达式解析日期是可能的,但令人沮丧。很难正确,非正则表达式向导很难理解表达式(这意味着很难证明事情是正确的),并且与其他选项相比它很 _慢_。

原文由 Jim Mischel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题