一,工作实例:
string = "foo-bar-25-baz"
if string =~ /(.+)-(10|25)(?:-(baz))?/
puts $1
puts $2
puts $3
end
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它在三行上产生'foo-bar','25'和'baz'.但是如果我们这样做:
string = "foo-bar-25-baz"
if string =~ /(.+)-(10|25)(?:-(baz))?/
puts $1.gsub('-', ' ') # Here be the problem
puts $2 # nil
puts $3 # nil
end
Run Code Online (Sandbox Code Playgroud)
的价值$2和$3现在是零.我要puts $2和puts $3和,然后 $1.gsub(...),它会工作.据我所知,这只适用于gsub和gsub!
这会导致同样的问题:
string = "foo-bar-25-baz"
if string =~ /(.+)-(10|25)(?:-(baz))?/
puts $3.gsub('hard', 'h')
puts $1 # nil
puts $2 # nil
end
Run Code Online (Sandbox Code Playgroud)
我花了大约15分钟调试这个,我想知道为什么.
gsub很可能重新分配这些变量(几乎任何其他使用正则表达式引擎的函数).如果您gsub在使用所有原始匹配结果之前需要调用,请首先将它们存储到局部变量中match_results = [$1, $2, $3].