代码之家  ›  专栏  ›  技术社区  ›  Robert Speicher

当使用$1-$9正则表达式表单时,为什么对一个调用gsub(…)会对其他调用nil?

  •  2
  • Robert Speicher  · 技术社区  · 14 年前

    首先,一个工作示例:

    string = "foo-bar-25-baz"
    if string =~ /(.+)-(10|25)(?:-(baz))?/
      puts $1 
      puts $2
      puts $3
    end
    

    string = "foo-bar-25-baz"
    if string =~ /(.+)-(10|25)(?:-(baz))?/
      puts $1.gsub('-', ' ') # Here be the problem
      puts $2 # nil
      puts $3 # nil
    end
    

    价值观 $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
    

    我花了大约15分钟调试这个,我想知道为什么。

    1 回复  |  直到 14 年前
        1
  •  8
  •   bta    14 年前

    gsub 很可能是重新分配这些变量(就像使用regexp引擎的任何其他函数一样)。如果你需要打电话 在使用所有原始匹配结果之前,请先使用以下命令将它们存储到局部变量 match_results = [$1, $2, $3] .