任何人都可以修复这个12/24小时的时间regexp吗?

时间:2013-10-15 15:11:47

标签: jquery regex input masking maskedinput

我一直在网上寻找一种只做12/24小时时间格式(_ _:_ _没有AM / PM)验证的方法。要求是它必须主动防止会使时间无效的按键。它也必须在冒号不超过23之前接受1或2位数,并且在不超过59之后需要2位数。

我使用了jquery inputmask和maskedinput都无济于事。无论我尝试什么,他们都表现得并不完全正确。

我终于发现这篇文章http://blog.pierrejeanparra.com/2011/10/time-input-mask-regexp-powered/包含一些好的逻辑,并且产生了一个几乎完美的正则表达式,可以与regexp掩码绑定以获得所需的行为。不幸的是,在这个表达式中只留下了一个小小的bug,我一直绞尽脑汁而且无法弄明白。表达式如下

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

http://plnkr.co/edit/OE6PGTuCvQa380S7b8Zg?p=preview

2 个答案:

答案 0 :(得分:0)

如果有人有兴趣,这是答案。

^((([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]?))$

答案 1 :(得分:0)

这个简单的怎么样:

^(?:[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
----------------------------------------------------------------------