2017-02-17 2 views
1

ich dies von einer Code-Herausforderung gefunden:

def time_correct(t) 
    return unless t =~ /^\d{2}(:\d{2}){2}$/ 
end 

es verwendet wird, um herausfinden, ob zB "0;:44:07" ist eine reguläre Zeitzeichenfolge ("HH:MM:SS") oder nicht. Ich verstehe die Regex jedoch nicht. Kann mir jemand bitte die /^\d{2}(:\d{2}){2}$/ erklären? Vielen Dank!

+0

regex101.com ist gute Ressource zu lernen und verstehen regex. Siehe [dies] (https://regex101.com/r/WIH7FL/1). Überprüfen Sie den Abschnitt ERLÄUTERUNG oben rechts. – Tushar

+0

Kann diese Methode außer dem regulären Ausdruck alles andere als "nil" zurückgeben? Beachten Sie, dass die Regex "99: 99: 99" entspricht, obwohl das keine gültige Zeit ist. Wie lautet die URL für die von Ihnen genannte "Code Challenge"? –

+0

'def time_korrekt (t) zurück t wenn t.nil? || t. leer? zurückgeben, wenn t = ~/^ \ d {2} (: \ d {2}) {2} $/ t = t.split (":"). Map (&: to_i) Time.at (t [0] * 3600 + t [1] * 60 + t [2]).strftime "% H:% M:% S" Ende, das ist der vollständige Code. Ich habe nur die Zeile kopiert und eingefügt, die ich nicht vollständig verstanden habe. – Chaoguo0

Antwort

3

Auf /^\d{2}(:\d{2}){2}$/:

  1. /.../ delimiters den regulären Ausdruck.
  2. ^ passt den Anfang der Zeile, wenn im Multi-Line-Modus, oder den Anfang der Zeichenfolge andernfalls.
  3. \d Matches eine Ziffer
  4. {2} besagt, dass die vorhergehende Aussage \d 2 mal übereinstimmen müssen.
  5. (...) Begrenzer eine Fanggruppe. Sie gruppieren Dinge zusammen wie das übliche mathematische Klammer-Konzept und erlauben es Ihnen auch, auf sie zu verweisen, indem Sie \i verwenden, wobei i der Index der Gruppe ist. Beispiel (a), (b), ist a die Gruppe 1 und b ist die Gruppe 2.
  6. \d{2} nur auf der Stufe und erläuterte 34.
  7. {2} das gleiche wie auf dem Schritt 4, aber hier ist das vorhergehende die Erfassungsgruppe (:\d{2}), die auch 2 mal wiederholen muss.
  8. $ entspricht dem Ende der Zeile, wenn im Multi-Line-Modus, oder das Ende der Zeichenfolge andernfalls.

Wenn der Multi-Line-Modus aktiviert ist, entspricht Ihr Ausdruck nur Dinge wie:

22:33:44 
02:33:44 

Aber nicht so

22:33:44 d 
d 22:33:44 
f 02:33:44 f 

Wenn mehrzeilige nicht aktiviert ist, Ihr Ausdruck passt nur auf eine Zeichenfolge mit einem gültigen Ausdruck:

Aber nichts, an einer Schnur mit zwei gültigen Zeilen:

22:33:44 
02:33:44 

Dies ist ein Link für Live-Tests: https://regex101.com/r/cdSdt4/1