当使用$ 1- $ 9正则表达式表格时,为什么在一个零上调用gsub(...)?

Rob*_*her 2 ruby

一,工作实例:

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 $2puts $3,然后 $1.gsub(...),它会工作.据我所知,这只适用于gsubgsub!

这会导致同样的问题:

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分钟调试这个,我想知道为什么.

bta*_*bta 8

gsub很可能重新分配这些变量(几乎任何其他使用正则表达式引擎的函数).如果您gsub在使用所有原始匹配结果之前需要调用,请首先将它们存储到局部变量中match_results = [$1, $2, $3].

  • +1,gsub使用正则表达式来查找要替换的字符串,因此特殊变量`$ 1`,`$ 2`等将被重新分配! (2认同)