2012-12-01 30 views
1

我在第一次遇到Ruby中的MatchData#captures方法,想問問有人能爲我解釋一下。 Ruby文檔說:紅寶石捕獲方法和正則表達式

返回捕獲數組;相當於​​。

但是我目前正在一個長字符串上運行一個正則表達式,它似乎是返回給我的最後一項評估?這有意義嗎?

這是字符串:

431cdb7b1ad8183a1434b6d1a407731fac0ea61b8d720d733fefaa77f063df8e vidcoder [23/May/2012:01:17:16 +0000] 76.78.212.49 - B24DEA4883A9FF95 REST.GET.OBJECT accounts/6/videos/xboxcCFC/video.mp4 "GET /accounts/6/videos/xboxcCFC/video.mp4 HTTP/1.1" 206 - 2 697898511 56 56 "-" "Apple Mac OS X v10.6.8 CoreMedia v1.0.0.10K549" - 

這是正則表達式:

line.match(%r{^.*\s+HTTP.*\s+-\s+(\d+)\s+}).captures 

它在這種情況下返回2號

回答

4

既然你只在你經常指定一個捕獲組。表達式,它只返回它(作爲一個包含「2」字符串的單元素數組,它與直接返回「2」字符串不同):

line.match(%r{^.*\s+HTTP.*\s+-\s+(\d+)\s+}).captures 
=> ["2"] 

如果試圖捕捉更多的元素,你的陣列將包含更多的元素,正如文件中指出:

line.match(%r{^.*\s+HTTP(.*)\s+-\s+(\d+)\s+}).captures 
=> ["/1.1\" 206", "2"] 
+0

確定了它謝謝。似乎我需要更好地理解我的正則表達式,因爲這決定了捕獲方法將返回什麼?我注意到你把(。*)導致3個元素被返回 – BC00

+0

@ BC00事實上:每次用()包圍你的正則表達式的某個部分時,它表明你想捕獲它以備後用。你可以在這裏得到更多的解釋以及Ruby regexp測試:http://www.rubular.com/ – Eureka

+0

真棒謝謝你! – BC00