正则表达式匹配时间表达式(mm:ss)

时间:2012-08-08 13:04:41

标签: regex

我有一个应用程序,我想检查时间输入。分钟(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我想知道:为什么它与最后一个匹配(你会如何建议我修改我的正则表达式以排除这种情况)?

2 个答案:

答案 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}$