Jquery 有人能修复这个12/24小时的时间regexp吗?

Jquery 有人能修复这个12/24小时的时间regexp吗?,jquery,regex,input,masking,maskedinput,Jquery,Regex,Input,Masking,Maskedinput,我一直在互联网上搜寻一种只进行12/24小时时间格式(无AM/PM)验证的方法。要求是,它必须积极防止可能使时间无效的按键。它还必须在冒号不超过23之前接受1或2个数字,在冒号不超过59之后需要2个数字 我使用jquery inputmask和maskedinput都没有用。不管我怎么做,他们的行为都不完全正确 我终于找到了这篇文章,它包含了一些好的逻辑,并生成了一个几乎完美的regexp,可以与regexp mask绑定以获得所需的行为。不幸的是,在这个表达式中只剩下一个小错误,我一直在绞尽脑

我一直在互联网上搜寻一种只进行12/24小时时间格式(无AM/PM)验证的方法。要求是,它必须积极防止可能使时间无效的按键。它还必须在冒号不超过23之前接受1或2个数字,在冒号不超过59之后需要2个数字

我使用jquery inputmask和maskedinput都没有用。不管我怎么做,他们的行为都不完全正确

我终于找到了这篇文章,它包含了一些好的逻辑,并生成了一个几乎完美的regexp,可以与regexp mask绑定以获得所需的行为。不幸的是,在这个表达式中只剩下一个小错误,我一直在绞尽脑汁,无法弄清楚。表达式如下

/^(([0-1][0-9]|2[0-3]|[0-9])|([0-1][0-9]|2[0-3]|[0-9])(:)[0-5]?[0-9]?)$/
它仍然存在的问题是它允许1:6,因为[0-5]是可选的。如果我尝试删除?[0-5]之后:将不再工作。非常感谢您的帮助。我知道这是一个常见的问题,似乎没有任何完美的解决方案

这是一个plnkr,演示了


如果有人感兴趣,下面是答案

^((([0-1][0-9]|2[0-3]|[0-9])|([0-1][0-9]|2[0-3]|[0-9])(:|h)|([0-1][0-9]|2[0-3]|[0-9])|([0-1][0-9]|2[0-3]|[0-9])(:|h)[0-5][0-9]?))$

这个简单的怎么样:

^(?:[01]?\d|2[0-3]):[0-5]?\d$
说明:

The regular expression:

(?-imsx:^(?:[01]?\d|2[0-3]):[0-5]?\d$)

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  ^                        the beginning of the string
----------------------------------------------------------------------
  (?:                      group, but do not capture:
----------------------------------------------------------------------
    [01]?                    any character of: '0', '1' (optional
                             (matching the most amount possible))
----------------------------------------------------------------------
    \d                       digits (0-9)
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
    2                        '2'
----------------------------------------------------------------------
    [0-3]                    any character of: '0' to '3'
----------------------------------------------------------------------
  )                        end of grouping
----------------------------------------------------------------------
  :                        ':'
----------------------------------------------------------------------
  [0-5]?                   any character of: '0' to '5' (optional
                           (matching the most amount possible))
----------------------------------------------------------------------
  \d                       digits (0-9)
----------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

删除这两个问号应该是可行的。如果您希望它要求冒号后跟分钟(目前看起来它只能接受小时或小时:分钟),请删除第一部分
([0-1][0-9]| 2[0-3]|[0-9])。
数据验证是一回事。用户体验是另一个问题。我发现那些实施严格限制的网站或程序经常因为一些错误而激怒我。为什么要现场验证?为什么不在提交时验证或模糊并将字段变为红色,而不是主动防止按键?用户体验对于这个regexp来说确实很棒。客户的要求非常严格,不幸的是,验证需要到位。这里有不止一个“小错误”。是否确实要允许
0
-
9
10
-
23
(不带冒号)?怎么样
0:-23:
,之后什么都没有?我认为在冒号后只允许一个数字是个坏主意。我认为您遇到的问题是,并非有效时间的每个子字符串本身就是有效时间(事实上,大多数不是)。因此,您不能使用单个正则表达式来检查字段是否始终有效。为什么要复制
([0-1][0-9]| 2[0-3]|[0-9])