从Ruby正则表达式中获取匹配组值

时间:2014-06-10 07:52:01

标签: ruby-on-rails ruby regex

这里只是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')

所以只是好奇这背后的魔力是什么?

感谢您的帮助!

3 个答案:

答案 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