我有一个应用程序,我想检查时间输入。分钟(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
我想知道:为什么它与最后一个匹配(你会如何建议我修改我的正则表达式以排除这种情况)?
答案 0 :(得分:2)
试试这个:
^(?:\d{1,4}:)?[0-5]?\d$
如果我们之前匹配至少一位数,我们只匹配冒号(:
)。您的模式允许冒号前面没有数字,因此您的文本可以从它开始。
工作示例:http://rubular.com/r/rFROIed8Pg
一个棘手的选项是^\b\d{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})
- 但只有冒号后跟两位数字!这是一个lookahead - 如果冒号后只有一个数字,则会失败。答案 1 :(得分:1)
这说匹配
^([0-9]){0,4}(?=\:)\:?([0-5]){0,1}([0-9]){1}
OR
([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}$