2014-06-10 31 views
0

只是一個新手到Ruby在這裏:拿到賽組出值的Ruby的正則表達式

試過類似的代碼今天如下:

m = /(.*)xyz(.*)/.match("abcxyzdef") 

隨後將Ruby設置全局變量$ 1 =「ABC」和$ 2 =「 DEF」 但如果代碼是這樣

str1 = $1 
str1.gsub!('a', '0') 
str2 = $2 
在這種情況下

,STR2將無法得到比賽團體str2=nil值,除非

str1 = $1 
str2 = $2 
str1.gsub!('a', '0') 

所以只是好奇這背後有什麼魔法?

感謝您的幫助!

回答

4

gsub,像match使用正則表達式引擎,從而覆蓋$ 1,$ 2變量。如果要訪問存儲在這些變量中的數據,則需要在執行另一個正則表達式方法之前將它們存儲在臨時變量中。

result = [$1, $2] 
0

當然,你可以隨時使用匹配的返回值(你甚至將它分配給m):

str1 = m[1] 
# => "abc" 
str1.gsub!('a', '0') 
# => "0bc" 
str2 = m[2] 
# => "def" 
0

由於@UriAgassi建議,我更願意訪問由match返回MatchData對象因爲它比$0,...,$9全局變量更加隱蔽。不過,我傾向於更喜歡match的塊形式,因爲它明確了匹配屬於哪個正則表達式。

/(.*)xyz(.*)/.match("abcxyzdef") do |m| 
    str1, str2 = m.captures 
    str1.gsub!('a', '0') 
end