50

我想解析一个hh:mm:ss字符串。一个简单的方法是([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d) 期望2:3:2402:03:24字符串。

我想更进一步,即使在像这样的情况下也能通过验证

  1. 如果你只输入56,它应该是通过,因为56可以被认为是56秒[SS]
  2. 如果您输入 2:3 或 02:03 或 02:3 或 2:03 它应该通过。2 分 3 秒 [MM:SS]
  3. 如果您输入 20:30:12 通行证,时间为 20 小时 30 分 12 秒 [HH:MM:SS]
  4. 如果你输入 78:12 ,不要超过 78 分钟是错误的......

基本上,如果找到一个“:”,则将“:”之前的数字视为 MM,将“:”之后的数字视为 SS 。如果找到两个“:”,则认为是 HH:MM:SS

我想出了这个模式。

(^([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)$)|(^([0-5]?\d):([0-5]?\d)$)|(^[0-5]?\d$)

它似乎工作正常。我想知道任何其他更简单的正则表达式,可以完成这项工作。

4

2 回答 2

144
^(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)$

解释:

^                   # Start of string
(?:                 # Try to match...
 (?:                #  Try to match...
  ([01]?\d|2[0-3]): #   HH:
 )?                 #  (optionally).
 ([0-5]?\d):        #  MM: (required)
)?                  # (entire group optional, so either HH:MM:, MM: or nothing)
([0-5]?\d)          # SS (required)
$                   # End of string
于 2011-11-29T22:03:22.420 回答
12

@Tim Pietzcker 涵盖了 OP 对 HH:MM:SS 解析器的要求,其中 SS 是强制性的,即

  • HH:MM:SS
  • MM:SS
  • 党卫军

如果您允许我稍微偏离 OP 的要求,并考虑 HH 是强制性的情况,即

  • 高:MM
  • HH:MM:SS

我想出的正则表达式是:

^([0-1]?\d|2[0-3])(?::([0-5]?\d))?(?::([0-5]?\d))?$

让我们分解一下:

  • ([0-1]?\d|2[0-3])- 几个小时的比赛
  • (?::([0-5]?\d))?- 可选择匹配几分钟
  • (?::([0-5]?\d))?- 可选择匹配几秒钟
于 2017-04-03T04:33:39.837 回答