2017-02-17 86 views
1

我發現這個從代碼的挑戰:

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

它是用來找出是否例如"0;:44:07"是否爲常規時間字符串("HH:MM:SS")。 雖然我不明白這個正則表達式。有人可以向我解釋/^\d{2}(:\d{2}){2}$/嗎?謝謝!

+0

regex101.com是學習和了解正則表達式的很好的資源。見[this](https://regex101.com/r/WIH7FL/1)。檢查右上角的說明部分。 – Tushar

+0

除了正則表達式,該方法可以返回除「nil」以外的任何內容嗎?請注意,正則表達式匹配''99:99:99'',即使這不是一個有效的時間。你提到的「代碼挑戰」的網址是什麼? –

+0

'def time_correct(t) return t if t.nil? || t.empty? return(除非t =〜/^\ d {2}(:\ d {2}){2} $/ t = t.split(「:」)。map(&:to_i) Time.at [0] * 3600 + t [1] * 60 + t [2])。strftime「%H:%M:%S」 end'那是完整的代碼。我只複製並粘貼了我沒有完全理解的那一行。 – Chaoguo0

回答

3

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

  1. /.../定界符正則表達式表達。
  2. ^行的開頭匹配,如果在多行模式,或者字符串的開頭,否則。
  3. \d匹配一個數字
  4. {2}指出,上述語句\d必須匹配的2倍。
  5. (...)定界符捕獲組。這組東西放在一起作爲通常的數學概念括號,也讓你使用你\i,其中i是組的索引後者指代他們。例如,(a)(b),a是組1,b是組2.
  6. \d{2}剛剛在步驟34中解釋。
  7. {2}相同的步驟4,但在這裏前述的是捕獲組(:\d{2}),這也必須重複2次。
  8. $線的端部相匹配,如果多行模式,或該字符串的末尾,否則。

如果啓用了多行模式,你的表情唯一的東西相匹配,如:

22:33:44 
02:33:44 

但不能作爲

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

如果未啓用多行,你的表達只有匹配包含一個有效的表達式作爲字符串:

22:33:44 

但沒有什麼,就用兩個有效行的字符串:

22:33:44 
02:33:44 

這是現場測試的鏈接:https://regex101.com/r/cdSdt4/1