【问题标题】:Verify date with regular expressions [duplicate]使用正则表达式验证日期 [重复]
【发布时间】:2015-04-25 10:53:43
【问题描述】:

日期格式为 2015/04/25 我在努力

^\d{4}\/\d{2}\/\d{2}$

它工作正常,但我想验证月份应该小于 12 并且日期小于 31

我试过了

^\d{4}\/(\d{2}\<[12])\/\d{2}$

但它不起作用。

PS:我是正则表达式的菜鸟。

【问题讨论】:

标签: javascript regex


【解决方案1】:

你可以使用

^\d{4}\/(0\d|1[0-2])\/([0-2]\d|3[01])$

解释:

  • \d{4} 任意四位数
  • (0\d|1[0-2]) 0(任何数字)或 1(0 到 2)即 00 to 0910-12
  • ([0-2]\d|3[01])(0 到 2)(任何数字)或 3(0 或 1),即 00 to 2930 or 31

Edit1:如果你想从 01-12 只匹配几个月,01-31 只匹配一天(没有 00)你可以使用:

^\d{4}\/(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01])$

Edit2:如果您想要严格验证日期,请使用 @Wayne.. 建议的 explodecheckdate.. 因为它还包括闰年验证。

Demo

【讨论】:

  • @king4aol 检查更新:)
  • 这仍然允许误报,例如 2015/02/31
  • @kingkero 是的.. 正则表达式仅用于匹配模式.. 如果我想为每个月单独设置验证规则,我会使用 explodecheckdate .. 因为它还考虑闰年验证.. :)
  • 是的,我的评论是针对 OP 的
  • 谢谢@karthikmanchala ,是的 kignkero 你是对的,但我可以在服务器端处理这个:)
【解决方案2】:

正如 jeroen 上面指出的,最好的解决方案是结合使用函数 explode 和 checkdate 。正则表达式不会捕获从未发生过的日期。

$exploded = explode("/", $date);
if(checkdate($exploded[1], $exploded[2], $exploded[0])){
   //Valid date.
}

PS,您可能还想检查 $exploded 数组中的元素数,因为您期望三个字符串。

【讨论】:

    【解决方案3】:

    这里是使用的@karthik manchala 所展示的相同原理的扩展版本

    ^((\d{4}\/(0[469]|11)\/(0[1-9]|1\d|30))|(\d{4}\/(0[13578]|1[02])\/([0-2]\d|3[01]))|(\d{4}\/(02)\/(0[1-9]|[12]\d)))$
    

    它将过滤 30 与 31 以及 2 月 29 以上的所有内容。但它无法识别 2 月何时使用 28 和 29。

    如果你想捕捉闰年,你可以很容易地做到这一点,如果它是最近的日期或不久的将来的日期,因为它可以被 4 整除,你可以捕捉 2000、2004、2008、2012 等,但规则不一致.

    【讨论】:

    猜你喜欢
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2014-03-30
    • 2011-05-16
    • 2013-04-22
    • 1970-01-01
    相关资源
    最近更新 更多