【问题标题】:Regex for Date?日期的正则表达式?
【发布时间】:2012-12-17 20:01:00
【问题描述】:

我正在尝试找到一种测试字符串是否符合当前标准的最佳方法。基本上,我有这样的约会:

1/17/2013  12:00 AM

月份和日期字段可以是一位或两位数,而年份始终是四位。小时可以是一位数或两位数。分钟字段始终为两位数例如,这也适用:

 10/1/2013  1:00 AM

现在,我有这个正则表达式,但它似乎不起作用:

/^(0[1-9]|1[0-2])\/(0[1-9]|[1-2][0-9]|3[0-1])\/(20[1-9][2-9]) (0[1-9]|1[0-2]):([0-5][0-9]) (am|pm)$/

我就是这样使用它的:

 $('input[name=targetMe]').each( function() {
        alert('start')
        if(/^(0[1-9]|1[0-2])\/(0[1-9]|[1-2][0-9]|3[0-1])\/(20[1-9][2-9]) (0[1-9]|1[0-2]):([0-5][0-9]) (AM|PM)$/.test($(this).val())) {
              alert('passes')
        } else {
              alert('dont')
        }
  });

我当前的正则表达式是否有问题,或者我应该以其他方式使用它,还是有比这更好的解决方案?

【问题讨论】:

    标签: javascript jquery regex


    【解决方案1】:

    相信你可以在Javascript中使用parse方法:

    https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/parse

    所以它会是这样的:

    $('input[name=targetMe]').each( function() {
        alert('start')
        if(Date.parse($(this).val())) {
              alert('passes')
        } else {
              alert('dont')
        }
    });
    

    【讨论】:

    • 这太棒了!但是,如果用户在输入中传递了一个数字,它仍然会以“通过”的形式返回。有没有解决的办法??不过我非常喜欢这种方法!
    • 我也在stackoverflow.com/questions/8082703/…中尝试了类似的解决方案,但是如果用户传递了一个数字,它也会失败。将其与另一种方法结合起来会很好吗?
    • 在我看来,如果您想接受所有日期提示,您可以使用此方法,但如果您只想接受特定格式的日期,您可以使用内联选择。例如,您也可以使用 str.split("/") str.split(" ") 并在输入上方指定您期望的格式。
    【解决方案2】:

    试试:

    /^(0?[1-9]|1[0-2])\/(0?[1-9]|[12]\d|3[01])\/(20[1-9]\d) (0?[1-9]|1[0-2]):([0-5]\d) ([AP]M)$/
    

    请注意,这匹配从(包括)2010 年到 2099 年的任何年份。您的正则表达式意味着您只需要从 2012 年到 2099 年的年份,在这种情况下,请使用类似 20(1[2-9]|[2-9]\d)

    【讨论】:

    • 我似乎无法让它通过我的任何日期,例如“1/17/2013 12:00 AM”。我在函数中写错了吗?另外,如果可能的话,我愿意接受任何年份,只要它是四位数,我一直是我的疏忽
    • 在您复制和粘贴的示例中,我的正则表达式中没有考虑到额外的空格。如果您删除它(即使用单个间距),它对我来说很好。如果您无法删除多余的空格,则需要适当更改正则表达式...如果您想要 2000-2999 之间的任何一年,请使用 2\d{3}
    • @NaveedS 在 JavaScript 中,正则表达式字面量使用语法 /regex/flags 定义。即/用作分隔符,所以如果要在表达式中包含/,则需要对其进行转义。
    • @Xophmeister 抱歉,我不知道如何在 Javascript 中使用正则表达式。感谢您的信息。
    • 我已经将它与这篇文章结合在一起 -- stackoverflow.com/questions/3286874/… -- 暂时删除空格并将它们传递给函数!我试图实现的唯一最后一件事是让任何一年都有效。
    【解决方案3】:

    好的,这是我找到的最终解决方案,它结合了我在这里收到的所有重要意见!

    $('input[name=targetMe]').each( function() {
        alert('start')
        if(/^([1-9]|1[0-2])\/([1-9]|[1-2][0-9]|3[0-1])\/(19[0-9][0-9]|20[0-9][2-9]) (0[1-9]|1[0-2]):([0-5][0-9]) (am|pm|AM|PM)$/.test($(this).val())) {
              alert('passes')
        } else {
              alert('dont')
        }
    

    });

    这将接受 1900 年代或 2000 年代的任何内容,以及日期和月份的一位数和两位数。

    【讨论】:

      【解决方案4】:

      您可以尝试Date.Parse 来尝试确定字符串是否为有效日期。但是,由于该方法依赖于实现,您还应该阅读关于此的注释 - javascripts and dates what mess

      要回答原始问题,如下所示的简单正则表达式就足够了。

      ^([1-9]|1[0-2]?)/([1-9]|[1-2][0-9]|3[0-1])/(19|20)[0-9][0-9] +(0?[0-9]|1[0-2]?):[0-5][0-9] +(a|p)m$
      

      ** 更正以过滤一些不正确的值 - 数字!= 时间 **

      如果日期和月份为 1 或 2 位数字,年份为 4,起始数字以 20 开头,小时为 1 或 2 位数字,分钟为 2 位数字,则上述将验证日期。日期和时间用两个空格隔开。

      我使用了 RegExp 对象,因为直接输入似乎有一个问题,/ 在表达式结束时被中断。另外,我添加了“i”标志,用于不区分大小写的 am/pm 搜索。要么转义它,要么更改为使用该对象。

      var regex = "^([1-9]|1[0-2]?)/([1-9]|[1-2][0-9]|3[0-1])/(19|20)[0-9][0-9] +(0?[0-9]|1[0-2]?):[0-5][0-9] +(a|p)m$";
      
      var val = "1/17/2013  12:00 AM";
      if(new RegExp(regex, "i").test(val)){
          alert("Success");
      } else {
          alert("Fail");
      }
      

      【讨论】:

      • 这似乎通过了正则表达式测试器,但是当我尝试将它放入我的函数中时,我收到一个 JS 错误,提示“SyntaxError: Unexpected token '^''。我如何将它与我现有的功能联系起来(非常感谢您的帮助,我还不是正则表达式忍者!)
      • 我正在尝试这个... if(^\d{1,2}/\d{1,2}/20\d{2}\s{2}\d{1 ,2}\:\d{2} (P|A)M$.test($(this).val())) { alert('passes') } else { alert('dont') }
      • 使用数字有问题,感谢同事指出。初始正则表达式会很高兴地接受 88:88 PM。在末尾使用/ 并开始。
      • 这看起来很神奇!但是,当我尝试将其与函数集成时,我仍然会遇到 JS 错误。我现在收到 'customMetaData_editor.js:485SyntaxError: Expected token ':'' 错误。您能否说明如何将这个特定的正则表达式集成到一个函数中?
      • 或者,如果可能的话,也许只是指出我的写入方向?再次感谢您迄今为止的所有帮助
      猜你喜欢
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      相关资源
      最近更新 更多