这里只是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')
所以只是好奇这背后的魔力是什么?
感谢您的帮助!
答案 0 :(得分:4)
gsub
,与match
一样,使用正则表达式引擎,因此会覆盖$ 1,$ 2变量。如果要访问存储在这些变量中的数据,则需要在执行另一个正则表达式方法之前将它们存储在临时变量中。
result = [$1, $2]
答案 1 :(得分:0)
当然,您始终可以使用匹配返回值(您甚至将其指定给m
):
str1 = m[1]
# => "abc"
str1.gsub!('a', '0')
# => "0bc"
str2 = m[2]
# => "def"
答案 2 :(得分:0)
正如@UriAgassi建议的那样,我更愿意访问match
返回的MatchData对象,因为它比$0
,...,$9
全局变量更不含神秘。但是,我倾向于更喜欢match
的块形式,因为它清楚地说明了匹配所属的正则表达式。
/(.*)xyz(.*)/.match("abcxyzdef") do |m|
str1, str2 = m.captures
str1.gsub!('a', '0')
end