用于在可选时间内验证dd / mm / yyyy的正则表达式

时间:2014-05-21 14:58:30

标签: regex

我想要一个正则表达式,它将验证日期是否采用以下格式之一:

  • DD / MM / YYYY
  • dd / MM / yyyy hh:mm
  • dd / MM / yyyy hh:mm:ss

到目前为止我已经

^([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/[1-2]\d{3}((\s([0-1]\d|[2][0-3])\:[0-5]\d\((:[0-5]\d)?)?)$

我一直在尝试an online regex tester。当我尝试21/05/2014但不是21/05/2014 15:5421/05/2014 15:54:12

时,输入会匹配

这可能是一个错位?错误,但凭借我有限的正则表达技能,它对我来说是正确的。

请注意,我并不希望对闰年和月内的事情过于挑剔。 [01-31] / [01-12] / [1000-2999]适用于日期部分。

1 个答案:

答案 0 :(得分:2)

在你的表达式中,你试图匹配一个文字的左括号:

((\s([0-1]\d|[2][0-3])\:[0-5]\d\((:[0-5]\d)?)?)
                               ^^

如果你删除它,你应该是好的。但是,我清理了一些这些比赛组...所以1是天,2是月,3是年,4是小时,5是分钟,6是秒:

^([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/([1-2]\d{3})(?:(?:\s([0-1]\d|[2][0-3])\:([0-5]\d)(?::([0-5]\d))?)?)$

Demo

但是,如果表达式很复杂,可能需要使用x修饰符并添加空格&评论(?# ... )


最后,我可以建议much simpler之类的内容:

^\d{2}\/\d{2}\/\d{4}\s*(?:\d{2}:\d{2}(?::\d{2})?)?$

这更容易阅读/修改/调试,并且仍然匹配同一组数字。您可以使用您的语言(PHP,Java,Javascript,Python等)库来尝试来创建DateTime类。如果失败,那么您知道它的日期无效。这也将更加准确,因为您的表达式仍将匹配30/02/2014,而不是一天。