2009-09-29 7 views
26

Me gustaría una expresión regular de JavaScript que coincida con el tiempo usando el reloj de 24 horas, donde la hora se da con o sin los dos puntos.Expresión regular para el tiempo de coincidencia en formato militar (24 horas)

Por ejemplo, me gustaría que coincida con el tiempo en los siguientes formatos:

  • 0800
  • 23:45
  • 2345

pero eso no va a coincidir veces no válidos como

  • 34:68
  • 5672
+2

upvoted para dar ejemplos y contraejemplos. –

Respuesta

87

Esto debe hacerlo:

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

La expresión lee:

^  Start of string (anchor) 
(  begin capturing group 
    [01] a "0" or "1" 
    \d  any digit 
|  or 
    2[0-3] "2" followed by a character between 0 and 3 inclusive 
)  end capturing group 
:?  optional colon 
(  start capturing 
    [0-5] character between 0 and 5 
    \d  digit 
)  end group 
$  end of string anchor 
+4

24:00 no existe, pero coincide. Cambia '[0-4]' a '[0-3]'. – strager

+0

Oops ... brain-wrong – Greg

+0

o en la forma: ^ (([0-9]) | ([0-1] [0-9]) | ([2] [0-3])):? ([0-5] [0-9]) $ si no te gusta el \ d cosas :) –

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

Esto coincidirá con 29:00 – Greg

+0

Fijo. Gracias, Greg. –

5
/(00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23):?(0|1|2|3|4|5)\d/ 

:)

+1

No hizo que los dos puntos sean opcionales. –

+1

Gracias. Estaba escribiendo el número demasiado rápido, así que lo olvidé :) – Zed

+0

esta respuesta es mucho mejor que la aceptada. El aceptado no se puede leer sin comentarios – Toskan

-1

No creo que la expresión regular es la mejor solución para este problema. Claro, se PODRÍA hacer, pero parece estar mal.

Asegúrate de que tu cadena tenga cuatro caracteres, o 5 caracteres con dos puntos en el medio. Luego, analice cada lado y asegúrese de que el lado izquierdo sea menor que 24 y la mano derecha sea menor que 60.

La solución de expresiones regulares es mucho más complicada.

+0

¿Por qué no es la expresión regular una buena solución? – strager

+1

¿No has leído las otras publicaciones? Hubo numerosos intentos, y casi NADIE obtuvo la solución correcta (o incluso entendió el problema por completo). Mi solución es bastante difícil de perder en cualquier idioma o implementación. –

+2

Ah, también hay muchas maneras de estropear tu solución. Especialmente si estás tratando de escribir rápido como nosotros. –

2

Para mantener el colon opcional y permitir que todas las horas de validez:

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

Tenga en cuenta que esto supone la medianoche siempre será 0000 y nunca 2400.

0

Here's a blog post, looking for the same thing y un montón de posibles respuestas, la mayoría de las cuales no funcionan, pero hay una buena discusión sobre por qué cada una falla.

¡Por supuesto, explicitly long and accurate es siempre una posibilidad!

+0

Sí, él podría simplemente generar todos los tiempos posibles para una matriz (debe ser menor que 16k), y luego es solo una comparación =) – Zed

-1

Retire la ':' si la cadena tiene uno, entonces si la cadena es de la forma "DDDD", convertirlo en un int y compararlo con 2400.

+0

2380 no es válida. Tienes que comparar ambos lados como sugerí. –

+0

Ack, tienes razón. –

0

Este es el que yo he acabo con:

(^ ((2 [0-4]) | ([01]? [0-9])): [0-5] [0-9] $) | (^ ((1 [0- 2]) | (0? [1-9]) (: [0-5] [0-9])?) [PA] $ m)

Acepta:

14:00 las 4:30 am 07:05 18:45 6:19 00:55

no acepta "12:05a.m." - no estoy seguro de si hay tiempo como "0am"

Si considera que ":" es opcional para el formato de hora de 24 horas (militar) - sólo tiene que añadir un signo de interrogación después de que

5

Aquí es AB solución etter que la superior para militares más una solución civil.

Militar

^(((([0-1][0-9])|(2[0-3])):?[0-5][0-9])|(24:?00)) 

Creo que la respuesta o en el más alto rating no es analizar correctamente los subconjuntos antes y después sin el conjunto adicional de paréntesis para agruparlos. Además, no estoy seguro de que \d sea solo 0-9 en todas las iteraciones. Técnicamente incluye el especial [[:digit:]] aunque nunca he tratado con ese problema anteriormente. De cualquier modo, esto debe proporcionar todo lo que incluye el crossover 2400/24: 00

Civil

^([0-9]|([1][0-2])):[0-5][0-9][[:space:]]?([ap][m]?|[AP][M]?) 

Ésta es una versión civil agradable que permite la gama completa formateado como 24:30, 12: 30P, 12:30 p.m., 12: 30p, 12:30 p.m., 12:30 p.m., 12:30 p.m. o 12:30 p, pero requiere que los caracteres matutinos o pos meridianos sean el mismo caso si se incluyen ambos (no Am o pM)

Uso ambos en un poco de JavaScript para validar las cadenas de tiempo.

+0

Gracias, Stijn, por la ayuda de formateo. –

+0

Gracias, me gusta este. Sin embargo, agregué los $ al final. Además, hice el 0 opcional al comienzo (es decir, 01:25 podría ser 1:25). Con suerte no estropeó nada en el camino.^(((([0-1]? [0-9]) | (2 [0-3])):? [0-5] [0-9]) | (24:? 00)) $ – nardnob

+0

El civil parece no funcionar. Si lo arroja a http://regexr.com/ y prueba 12: 30p, no devuelve ninguna coincidencia. – ThePersonWithoutC

0

Sé que esta es una vieja pregunta, pero aquí hay una expresión regular que se me ocurrió que parece funcionar.

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

Puede editarlo on this regex site

Editar me he dado cuenta de que esta respuesta terminó exactamente la misma que la respuesta aceptada, pero voy a dejarlo aquí al menos por el valor de la 'hacer usted mismo' enlace

0

Esto es perfecto:^0 ([0-9] [0-2]?):? Sólo 12 horas reloj: [0-5] [0-9] $

Nota

para tiempos como: 0: 01- 12:59

o

00:01 - 12:59

+0

Lo siento: esta es la perfecta: (([0-9] [0- 2]?) | ([0] [0-9])): [0-5] [0-9] $ – Byorn

Cuestiones relacionadas