HH:MM:SS时间string的正则expression式模式

我想parsing一个hh:mm:ssstring。 简单的是([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)其中2:3:2402:03:24string。

我想更进一步,并通过validation,即使在像

  1. 如果你只input56,那应该是通过的,因为56可以被认为是56秒[SS]
  2. 如果您input2:3或02:03或02:3或2:03,则应通过。 2分3秒[MM:SS]
  3. 如果你进入20:30:12,20小时30分12秒[HH:MM:SS]
  4. 如果你input78:12,不通过78分钟是错误的….

基本上,如果find一个“:”,把“:”之前的数字看作是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$) 

它似乎工作正常。 我想知道任何其他更简单的正则expression式,可以做这个工作。

 ^(?:(?:([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 

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

  • HH:MM:SS
  • MM:SS
  • SS

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

  • HH
  • HH:MM
  • HH:MM:SS

我提出的正则expression式是:

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

让我们来分解一下:

  • ([0-1]?\d|2[0-3]) – 可以匹配几个小时
  • (?::([0-5]?\d))? – 可选的匹配分钟
  • (?::([0-5]?\d))? – 可选地匹配秒