2011-11-29 25 views
28

Voglio analizzare una stringa hh:mm:ss. Uno semplice è ([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d) che si aspetta 2:3:24 o 02:03:24 stringa.Schema Regex per HH: MM: stringa ora SS

voglio prendere un ulteriore passo avanti e superare la validazione, anche in casi come

  1. se si immette solo 56, si deve passare, come 56 può essere considerato come 56 secs [SS]
  2. se inserisci 2: 3 o 02:03 o 02: 3 o 2:03 dovrebbe passare. 2 minuti e 3 secondi [MM: SS]
  3. Se inserisci 20:30:12 passa con 20 ore, 30 minuti e 12 secondi [HH: MM: SS]
  4. se inserisci 78:12, non passare 78 minuti è sbagliato ....

in sostanza, se uno ":" si trova, in considerazione numero prima ":" come MM e il numero dopo ":" come SS . Se due ":" sono considerati considerare come HH: MM: SS

Mi sono inventato questo modello.

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

Sembra funzionare correttamente. Volevo conoscere qualsiasi altra espressione regolare più semplice, che possa fare il lavoro.

+0

Per le vostre esigenze, che assomiglia ad un notevole semplice regex. –

risposta

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

Spiegazione:

^     # 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 
+2

Grazie mille. Questo è molto più semplice e interessante.Voglio imparare regex. Per favore, indicami la giusta direzione. Come imparo regex. Tutto quello che so attualmente è sintassi di base (tipo di tutorial rapido) – user418836

+7

@ user418836: consulta www.regular-expressions.info –

+2

@ user418836 - che ne dici di un upvote per Tim. –

4

@ Tim Pietzcker copre requisito del PO di un HH: MM: SS parser dove SS era obbligatorio, cioè

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

Se mi si consente di deviare dal requisito del PO per un po ', e prendere in considerazione il caso in cui HH è obbligatoria, vale a dire

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

L'espressione regolare che mi è venuta è stata:

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

Rompiamo giù:

  • ([0-1]?\d|2[0-3]) - le partite per ore
  • (?::([0-5]?\d))? - partite a scelta per minuti
  • (?::([0-5]?\d))? - partite a scelta per secondi