【问题标题】:regular expression for dd-mm-yyyy hh:mmdd-mm-yyyy hh:mm 的正则表达式
【发布时间】:2014-04-29 09:22:44
【问题描述】:

我想查看dd-mm-yyyy hh:mm格式的日期,现在我正在使用

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

正则表达式匹配dd-mm-yyyy格式的日期

但我想检查dd-mm-yyyy hh:mm 格式。 任何人都可以将这个正则表达式修改为dd-mm-yyyy hh:mm 格式吗?

【问题讨论】:

  • 日期示例 = 22-12-2013 21:30
  • 从日期时间导入日期时间 datetime.strptime("2014","%Y")
  • 我想检查输入类型 22-12-2013 21:30 以验证格式是否不是 dd-mm-yyyy hh:mm 就像我使用 var date_regex = /^(0[1- 9]|1\d|2\d|3[01])\-(0[1-9]|1\d|2\d|3[01])\-(19|20)\d{2 }$/ ; if(!(date_regex.test(dateval))) { 测试 dateval 格式 dd-mm-yyyy
  • 您希望允许 1-12-2010 喜欢日期吗?我会做那个正则表达式,但我需要知道你是否想要 01 或 1 也被允许
  • 使用哪种语言?你的日期是什么格式的? (是字符串,还是一些 DateTime 类型)如果您需要好的帮助,请花一些时间在您的问题上,并将相关代码添加到您的问题中,不要将其放入评论中。

标签: regex validation date


【解决方案1】:

这是此类日期格式的正则表达式。
但请注意,它同时接受 1-12-2011 19:2001-12-2011 19:20 的日期。

^([1-9]|([012][0-9])|(3[01]))-([0]{0,1}[1-9]|1[012])-\d\d\d\d [012]{0,1}[0-9]:[0-6][0-9]$

【讨论】:

  • 这不适用于小时和分钟不正确的日期字符串,例如'01-02-2016 28:61',我已经发布了适合我的日期字符串
【解决方案2】:

日期格式的正则表达式 dd-mm-yyyy hh:mm

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

Javascript 示例:
/^([1-9]|([012][0-9])|(3[01]))\-([0]{0,1}[1-9]|1[012])\-\d\d\d\d\s([0-1]?[0-9]|2?[0-3]):([0-5]\d)$/.test('12/12/2017 12:45') 返回 true

/^([1-9]|([012][0-9])|(3[01]))\-([0]{0,1}[1-9]|1[012])\-\d\d\d\d\s([0-1]?[0-9]|2?[0-3]):([0-5]\d)$/.test('12/12/2017 12:65') 返回错误

【讨论】:

  • 请先看这个how-to-answer这个问题之前回答过,显然,你可以在这里添加你的答案。但是在回答之前,您需要了解一些要点。首先,不要添加以前使用相同代码或建议添加的答案。其次,如果用户已经非常具体地询问了问题以及他需要解决什么问题,请不要添加过于复杂的答案。第三,如果您想对答案或问题提出任何建议,可以添加评论。
  • @ankitsuthar,标记为正确的答案对我不起作用,请尝试使用“01-02-2016 28:61”之类的示例(注意小时和分钟不正确)标记的正则表达式as correct 将为此返回 true,这是不正确的。你可以使用regex101.com来试试
  • 当我将示例粘贴到控制台时,它返回 false :(
【解决方案3】:

鉴于日期是不规则的(每个月的天数根据月份、年份和世纪而有所不同,因此它们不太适合正则表达式,至少在检查有效性方面是这样。

例如,确保您不会得到 2 月 30 日或 2 月 29 日的正则表达式(除非年份是 4 的倍数而不是 100 的倍数,除非它也是的倍数400)将是真正可怕的。

我建议只使用一个非常简单的正则表达式来检查 格式, 类似于:

\d{2}-\d{2}-\d{4} \d{2}:\d{2}

然后提取各个字段以在代码中进行单独的有效性检查。

正则表达式是一个强大的工具,但与任何工具一样,您必须知道何时(以及何时)使用它们。这是真正的工具匠的标志。

无论如何,您的正则表达式存在 Y2.1K 问题。一旦你达到 2100,它就会停止工作。不要认为你有足够的时间,我们认为 Y2K 也是如此 :-)

【讨论】:

    【解决方案4】:

    这样就可以了:

    /^(0[1-9]|1\d|2\d|3[01])-(0[1-9]|1\d|2\d|3[01])-(19|20)\d{2}\s+(0[0-9]|1[0-9]|2[0-3])\:(0[0-9]|[1-5][0-9])$/
    

    查看Regexper 以获得解释:)

    【讨论】:

    • 你能给我你测试这个正则表达式的日期例子吗
    • 您的第二个捕获组应该是(0[1-9]|1[012]) 以反映月份。在某些区域,00:0024:00 都是有效时间
    • stema:好点——更新我的答案; Jan:在某些地区,甚至 26:00 也是有效的时间表达,但我们应该考虑 OP 的用例,而不是所有概率。
    【解决方案5】:

    如果您确信它将始终是 dd 而不是 d 等等(mmm),那么您可以使用:

    /\d{2}-\d{2}-\d{4} \d{2}:\d{2}/

    但是,如果您不确定它将始终是 dd,而可能只是 d,我建议:

    /\d{1,2}-\d{1,2}-\d{2,4} \d{1,2}:\d{2}/

    我将分钟记为\d{2},因为我从来没有看到下午 1:05 写成 1:5。

    当然,这只会验证它或多或少符合正确的格式 - 这不会检查疯狂的日期,例如“2 月 99 日”。考虑删除此答案,因为其他答案更好。

    【讨论】:

    • 这意味着您的模式匹配但其中没有(捕获(组))匹配主题字符串中的任何内容。当我在regex101.com 中测试 /\d{2}-\d{2}-\d{4} \d{2}:\d{2}/ 表达式时,我得到了上述信息,你能解决吗跨度>
    【解决方案6】:

    这是一个与您的格式完全匹配的正则表达式,请记住天和月不能是 00,小时不能是 24,分钟/秒不能是 60。

    /(0[1-9]|[12]\d|3[01])-(0[1-9]|1[0-2])-\d{4} ([01]\d|2[0-3])(:[0-5]\d){2}/gm

    作为旁注,无论位置如何,都可以使用它来从较大的字符串中解析日期。

    【讨论】:

      【解决方案7】:

      尝试以下方法:

      $value = "22-12-2013 21:30";
      
      if($value=~m/([0-9]{2})-([0-9]{2})-([0-9]{4}) ([0-9]{2}):([0-9]{2})/){
         print "Matched\n";
      }
      else{
         print "Not matched...";
      }
      

      【讨论】:

      • 99-99-9999 99:99 并不是一个合适的日期
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 2017-07-10
      • 2011-07-11
      • 1970-01-01
      • 2022-01-04
      相关资源
      最近更新 更多