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