1

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

4

2 回答 2

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})- 但前提是冒号后跟两位数字!这是一个前瞻- 如果冒号后面只有一位数字,它将失败。
于 2012-08-08T13:19:11.253 回答
1

这说匹配

^([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}$
于 2012-08-08T13:15:55.730 回答