【问题标题】:Javascript Regular Expression to validate dateJavascript正则表达式验证日期
【发布时间】:2011-04-25 03:37:21
【问题描述】:

我对正则表达式相当陌生。我正在尝试为 mm.dd.yyyy、mm/dd/yyyy 或 mm-dd-yyyy 编写正则表达式。这是我到目前为止所拥有的,我完全不确定我是否接近。

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

谢谢

【问题讨论】:

  • @kennebec 为您提供了比正则表达式更好的完美解决方案,您应该接受他的回答。

标签: javascript regex date


【解决方案1】:
/^\d{2}([.\/-])\d{2}\1\d{4}$/

将匹配01/01/200001.01.2000、而不是01/01.2000

/^(\d{2})([.\/-])(\d{2})\2(\d{4})$/

在包装三个日期部分时也是如此。

【讨论】:

  • 所以\1 引用了第一组?我想了解,谢谢
  • 这也适用于 98/42/2343,这不是一个真实的日期
【解决方案2】:
/^\d{2}[.\/-]\d{2}[.\/-]\d{4}$/

jsFiddle.

请注意,这将允许它们混淆,即01/02-2010 将是有效的。为了阻止这种情况,像这样写三遍......

/^(?:\d{2}\.\d{2}\.\d{4}|\d{2}\/\d{2}\/\d{4}|\d{2}-\d{2}-\d{4})$/

jsFiddle.

(或者只检查cwolves's wonderful answer。)


你的问题标题说...

Javascript 正则表达式验证日期

如果您还需要提取这些部分,请将它们用括号 (()) 括起来,这会将它们变成捕获组。如果匹配成功,它们将存储在返回数组的成员中。

【讨论】:

  • @alex:我到底把它放在哪里了?谢谢!
  • @willis 你可以像dateStr.match(/regex-here/)一样使用它。如果返回null,则不匹配。
  • /^\d{2}([.\/-])\d{2}\1\d{4}$/ 不需要第二个例子。
【解决方案3】:

我见过一些奇怪的正则表达式来匹配实际日期 - 例如,它们不会匹配 04/31/yyyy 或 2011 年 2 月 29 日。

尝试从输入中生成日期,然后检查输入更简单。

function isvalid_mdy(s){
    var day, A= s.split(/\D+/).map(function(itm){
        return parseInt(itm, 10)
    });
    try{
        day= new Date(A[2], A[0]-1, A[1]);
        if(day.getMonth()+1== A[0] && day.getDate()== A[1]) return day;
        throw 'Bad Date Format';
    }
    catch(er){
        return NaN;
    }

}

var s1= '04/31/2011';
isvalid_mdy(s1)

/*  returned value: (Number)
NaN

*/

【讨论】:

  • 这是迄今为止我见过的最好的。精心打造。
【解决方案4】:

在 PHP 中我使用命名匹配,所以不同的格式很容易:

$format = 'y-m-d'; // or 'd-m-y' or 'd/m/y' etc
$regexp = '#^'.strtr(preg_quote($format), array('y' => '(?P<year>(?:1|2)\d{3})', 'm' => '(?P<month>\d\d?)', 'd' => '(?P<day>\d\d?)')).'$#';

但我认为这在 JS 中是不可能的。也许命名匹配其他方式...

编辑
我试过这个:

'2004-8-29'.match(/^(\3\d{4})-(\2\d\d?)-(\1\d\d?)$/)

但我认为不是这样...(注意实际捕获/匹配之前的 \3、\2 和 \1)

按照 1、2、3 的顺序,它匹配。按照 3、2、1 的顺序,它没有。不知道\1\2\3 做什么=)

【讨论】:

    【解决方案5】:

    我不喜欢为.-/ 分别重复一次模式

    试试下面的方法:

    ^(\d{2})(\/|-|\.)(\d{2})\2(\d{4})$
    

    注意使用\2 表示第二个匹配组,即.-/ 的组。这将确保 mm 和 dd 之间的任何符号都将在 dd 和 yyyy 之间匹配。

    【讨论】:

      【解决方案6】:

      一个有趣的技巧是你可以使用 Date.parse() 来做一些事情:

      // 1303617600000
      Date.parse('4/24/2011')
      
      // 1303617600000
      Date.parse('4-24-2011')
      
      // 1303617600000
      Date.parse('4.24.2011')
      
      // NaN
      Date.parse('4/32/2011')
      
      // NaN
      Date.parse('foo')
      

      它并不完全严格。例如,它将成功地将 2/30/2011 解析为有效。不过,这是一个很好的 99% 严格的健全性测试。

      【讨论】:

      • @Dave Ward:我不是想挤奶你的答案,但你能把它完整地写出来吗,我不明白吗?谢谢
      • 你确定这行得通吗? var d = Date.parse("4-24-2011");NaN
      • @manojlds:是的,我在发布之前在控制台上测试了所有这些。但是,如果您的浏览器的语言环境不是使用 mm/dd/yyyy 日期的语言环境,它可能不起作用。
      • 它适用于 '/' 但不适用于 '.'和 '-' 对我来说,无论是 mm/dd/yyyy 还是 dd/mm/yyyy。无论如何,如果这基于用户的语言环境等不起作用,那么解决方案就是错误的。
      • @willis0924:测试Date.parse(dateString) !== NaN
      猜你喜欢
      • 1970-01-01
      • 2013-05-03
      • 2010-10-14
      • 1970-01-01
      • 2011-05-16
      • 2013-04-22
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      相关资源
      最近更新 更多