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

  1. Si ingresa solo 56, debe ser aprobado, ya que 56 puede considerarse como 56 segundos [SS
  2. Si ingresa 2: 3 o 02:03 o 02: 3 o 2:03 debe pasar. 2 minutos y 3 segundos [mm: ss
  3. Si ingresa a las 20:30:12 pase con 20 horas, 30 minutos y 12 segundos [HH: MM: SS
  4. 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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top