我有一个应用程序,我想检查时间输入。分钟(m,0-9999 之间的任何值)和秒(s,介于 0-59 之间的任何值)的允许形式为:
s
ss
m:ss
...
mmmm:ss
我目前的正则表达式是:
^([0-9]){0,4}(?=:):?([0-5]){0,1}([0-9]){1}|([0-5]){0,1}([0-9]){1}$
它匹配以上所有内容,但我不希望它匹配
:ss
虽然对我来说不匹配最后一个:ss
并不重要,但我想知道:为什么它与最后一个匹配(以及您如何建议我修改我的正则表达式以排除这种情况)?
试试这个:
^(?:d{1,4}:)?[0-5]?d$
是的,如果我们之前匹配至少一个数字,我们只匹配冒号 ( :
)。您的模式允许前面没有数字的冒号,因此您的文本可以以它开头。
工作示例:http://rubular.com/r/rFROIed8Pg
^bd{0,4}:?[0-5]?d$
一个更棘手的选项 - 这使得冒号和分钟都是可选的,但与字符串开头的冒号不匹配。
关于评论的一些附加说明:
要禁止mmm:s
(个秒位数),一种可能的模式是:
^(?:d{1,4}:(?=d{2}))?[0-5]?d$
快速解释:
- 结局很简单:
[0-5]?d$
- 0-59 - 第一部分比较棘手:
-
d{1,4}:
- 匹配一到四位数字和一个冒号。 -
(?=d{2})
- 但前提是冒号后跟两位数!这是一个展望 - 如果冒号后只有一个数字,它将失败。
-
这表示匹配
^([0-9]){0,4}(?=:):?([0-5]){0,1}([0-9]){1}
或
([0-5]){0,1}([0-9]){1}$
试试这个
^([0-9]){0,4}(?=:):?([0-5]){0,1}([0-9]){1}|:?([0-5]){0,1}([0-9]){1}$