Motif Regex pour HH: MM: SS chaîne de temps

je veux analyser un hh:mm:ss chaîne de caractères. Un simple ([0-1]?d|2[0-3]):([0-5]?d):([0-5]?d) qui attend 2:3:24 ou 02:03:24 chaîne de caractères.

je veux aller plus loin, et passer les validation, même dans des cas comme

  1. si vous entrez seulement 56, il convient de passer, comme 56 peut être considéré comme 56 secondes [SS]
  2. si vous saisissez 2:3 ou 02:03 ou 02:3 ou 2:03 il doit passer. 2 minutes et 3 secondes [MM:SS]
  3. si vous entrez 20:30:12 passer avec 20 heures, 30 minutes et 12 secondes [HH:MM: SS]
  4. si vous entrez 78: 12, ne passez pas 78 minutes est erroné....

fondamentalement, si un ": "est trouvé, considérer le nombre avant ": "comme MM et le nombre après": "comme SS . Si deux ":" trouvé d'envisager sous la forme HH:MM:SS

j'ai trouvé ce schéma.

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

Il semble fonctionner correctement. Je voulais connaître n'importe quelle autre expression plus simple, qui peut faire le travail.

31
demandé sur Tim Pietzcker 2011-11-30 01:51:39

2 réponses

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

Explication:

^                   # 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
101
répondu Tim Pietzcker 2011-11-29 22:09:53

@Tim Pietzcker couvre l'exigence de L'OP pour un HH:MM: SS parser où SS était obligatoire, i.e.

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

si vous me permettez de m'écarter de l'exigence de L'OP pour un peu, et envisager un cas où HH est obligatoire, c.-à-d.

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

La regex, je suis venu avec était:

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

nous allons casser en bas:

  • ([0-1]?\d|2[0-3]) - rencontres pour heures
  • (?::([0-5]?\d))? - correspond en option pendant quelques minutes
  • (?::([0-5]?\d))? - correspond en option pour les secondes
5
répondu Stephen Quan 2017-04-03 04:38:52