使用正则表达式验证时间

时间:2014-06-30 14:47:33

标签: jquery regex validation time

我只需要允许在上午9点到下午4点之间的时间。

目前,我有:

/([01]?[0-9]|2[0-3]):([0-5][0-9])[APap][mM]/ 

用于验证格式hh:mmPM(不区分大小写)。

我在正则表达式上很糟糕,但有没有办法写它所以它只允许以下时间:

9:(0-59)AM
10:(0-59)AM 
11:(0-59)AM

例如:它应该允许9:05AM但不允许8:59AM

我还需要另一个正则表达式:

12:(0-59)PM
1:(0-59)PM 
2:(0-59)PM
3:(0-59)PM

例如:它应该允许3:05PM但不允许4:01PM

我当前的验证代码:

var time = document.forms["presentation"]["presentation-time"].value;
if (!/([01]?[0-9]|2[0-3]):([0-5][0-9])[APap][mM]/.test(time)) {
    $("#timeError").show();
    $("#presentation-time").focus();
    return false;
}
else {
     $('#timeError').hide();
}

我在考虑做&&在其余验证的if语句中。

4 个答案:

答案 0 :(得分:0)

/(1?[019]):([0-5][0-9])(AM)|(1?[1234]):([0-5][0-9])(PM)/是我能想到的唯一方法。

编辑:

比通过正则表达式强制验证时间更简单的方法是使用反向引用来捕获小时,分钟和时间的值,并使用它们来进行验证。事实上它增加了一些条件逻辑,但在我看来,它比正则表达式更容易阅读。

var time = document.forms['presentation']['presentation-time'].value;
var backreferences = new RegExp('(\d+):(\d+)(AM|PM)','i').test(time);
var hours = backreferences[1];
var minutes = backreferences[2];
var timeOfDay = backreferences[3];
if (!((hours >= 9 && hours <= 12 && timeOfDay === 'AM') ||
    (hours <= 4 && timeOfDay === 'PM'))) {
  $('#timeError').show();
  $('#presentation-time').focus();
  return false;
} else {
  $('#timeError').hide();
}

答案 1 :(得分:0)

你得到的几乎是正确的,你只需要约束时间:

/((0?9|1[01]):([0-5][0-9])AM)|((12|0?[123]):([0-5][0-9])PM)/

答案 2 :(得分:0)

我认为这个正则表达式会起作用:

/^(([0]?9|1[01]):([0-5][0-9])AM)|((12|0?[1-3]):([0-5][0-9])PM)|(0?4:00PM)$/i

答案 3 :(得分:0)

正则表达式

(0?[9]:[0-5][0-9])([aA]m|[pP]m)|(0[1-3]:[0-5][0-9])([[pP]m)|(\b[1-3]:[0-5][0-9])([[pP]m)|(1[0-2]:[0-5][0-9])([aA]m)

Demo