我有以下正则表达式,应该进行24小时格式验证,我正在https://rubular.com
中进行尝试/^[0-23]{2}:[0-59]{2}:[0-59]{2}$/
但是以下时间即使看起来正确也无法匹配
02:06:00
04:05:00
为什么会这样?
答案 0 :(得分:2)
在字符类中,您应该表示允许的字符范围(与示例中要匹配的数字相反)。在几分钟和几秒钟内,这相对简单-以下表达式
[0-5][0-9]
...将匹配从“ 00”到“ 59”的任何数字字符串。
但是在小时中,您需要两个单独的表达式:
[01][0-9]|2[0-3]
...一个将“ 00”匹配到“ 19”,另一个将“ 20”匹配到“ 23”。由于使用了替代字符(|
字符),因此需要对它们进行分组,这又增加了语法(?:...)
的位。最后,我们只是在字符串的开头和结尾添加锚点^
和$
,您已经有了它们所在的位置。
^(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$
如果愿意,您可以选中此solution out at regex101。
答案 1 :(得分:2)
您的问题是您理解字符范围错误:0-23
并不意味着“匹配从0到23的任何数字”,它意味着:0-2
-匹配一位数字:0,1或2 ,然后匹配3。
尝试以下模式:(?:[01][0-9]|2[0-3])(?::[0-5][0-9]){2}
说明:
(?:...)
-非捕获组
[01][0-9]|2[0-3]
-交替:匹配是0还是1,然后是0到9之间的任意数字 OR 2后面是0、1、2或3(00-23之间的数字)< / p>
(?::[0-5][0-9]){2}
-匹配:
和[0-5][0-9]
(基本上是从00-59的数字)两次
答案 2 :(得分:1)
使用此(([0-1]\d|[2][0-3])):(([0-5][0-9])):(([0-5][0-9]))