Patrón regex para HH: mm: cadena de tiempo SS
-
25-10-2019 - |
Pregunta
Quiero analizar un hh:mm:ss
cuerda. Uno simple es ([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)
Que espera 2:3:24
o 02:03:24
cuerda.
Quiero dar un paso más allá y pasar la validación incluso en casos como
- Si ingresa solo 56, debe ser aprobado, ya que 56 puede considerarse como 56 segundos [SS
- Si ingresa 2: 3 o 02:03 o 02: 3 o 2:03 debe pasar. 2 minutos y 3 segundos [mm: ss
- Si ingresa a las 20:30:12 pase con 20 horas, 30 minutos y 12 segundos [HH: MM: SS
- Si ingresa 78:12, no pase 78 minutos está mal ...
Básicamente, si uno ":" se encuentra, considere el número antes ":" como mm y número después ":" como SS. Si dos ":" se encuentran considerando como HH: MM: SS
Se me ocurrió este patrón.
(^([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)$)|(^([0-5]?\d):([0-5]?\d)$)|(^[0-5]?\d$)
Parece estar funcionando bien. Quería conocer cualquier otra expresión regular más simple que pueda hacer el trabajo.
Solución
^(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)$
Explicación:
^ # 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
Otros consejos
@Tim Pietzcker cubre el requisito de OP para un analizador HH: MM: SS donde SS era obligatorio, es decir
- HH: MM: SS
- MM: SS
- Ss
Si me permite desviarme de los requisitos del OP por un momento y considere un caso en el que HH sea obligatorio, es decir
- S.S
- HH: mm
- HH: MM: SS
El Regex que se me ocurrió fue:
^([0-1]?\d|2[0-3])(?::([0-5]?\d))?(?::([0-5]?\d))?$
Vamos a desglosarlo:
([0-1]?\d|2[0-3])
- Magos por horas(?::([0-5]?\d))?
- Opcionalmente coincide por minutos(?::([0-5]?\d))?
- Opcionalmente coincide por segundos