1

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

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')
        }
  });

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

4

4 回答 4

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')
    }
});
于 2013-01-03T12:49:18.007 回答
1

尝试:

/^(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)

于 2013-01-03T12:49:24.880 回答
1

您可以尝试Date.Parse尝试确定该字符串是否为有效日期。但是,由于该方法依赖于实现,您还应该阅读有关此的注释 - javascripts 和 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$

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

20如果日期和月份为 1 位或 2 位数字,年份为 4,起始数字以 开头,小时为 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");
}
于 2013-01-03T13:01:30.220 回答
1

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

$('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 年代的任何内容,以及日期和月份的个位数和两位数。

于 2013-01-03T14:14:48.013 回答