Regex pattern for HH:MM:SS time string
I want to parse a hh:mm:ss
string.
A simple one is ([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)
which expects 2:3:24
or 02:03:24
string.
I want to take it a step further and pass the validation even in cases like
- if you enter just 56, it should be pass, as 56 can be considered as 56 secs [SS]
- if you enter 2:3 or 02:03 or 02:3 or 2:03 it should pass. 2 minutes and 3 seconds [MM:SS]
- If you enter 20:30:12 pass with 20 hrs, 30 minutes and 12 secs [HH:MM:SS]
- if you enter 78:12 , do not pass 78 minutes is wrong....
Basically, if one ":" is found, consider number before ":" as MM and number after ":" as SS . If two ":" are found consider as HH:MM:SS
I came up with this pattern.
(^([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)$)|(^([0-5]?\d):([0-5]?\d)$)|(^[0-5]?\d$)
It seems to be working fine. I wanted to know any other simpler regular expression, that can do the job.
Solution 1:
^(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)$
Explanation:
^ # 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
Solution 2:
@Tim Pietzcker covers the OP's requirement for a HH:MM:SS parser where SS was mandatory, i.e.
- HH:MM:SS
- MM:SS
- SS
If you permit me to deviate from the OP's requirement for a bit, and consider a case where HH is mandatory, i.e.
- HH
- HH:MM
- HH:MM:SS
The regex I came up with was:
^([0-1]?\d|2[0-3])(?::([0-5]?\d))?(?::([0-5]?\d))?$
Let's break it down:
-
([0-1]?\d|2[0-3])
- matches for hours -
(?::([0-5]?\d))?
- optionally matches for minutes -
(?::([0-5]?\d))?
- optionally matches for seconds