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



我有一个应用程序,我想检查时间输入。分钟(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}$

最新更新