“\\ 1”与1美元对比。为什么我在Ruby中得到不同的结果

时间:2016-01-07 19:41:48

标签: arrays ruby regex

我在更长的脚本中使用它,但一个简短的例子将说明我遇到的问题类型。

my_array2 = ["help", "not", "too"]
my_array2.each do |element|
  element.sub!(/(\w{1})(\w+)/,"\\1")
end

# this gives me the expected ['h','n','t']

如果我做了

my_array2 = ["help", "not", "too"]
my_array2.each do |element| 
  element.sub!(/(\w{1})(\w+)/, $1)
end

# this gives me ['t','h','n'] (instead of ['h','n','t'] as expected).

发生了什么事?当我使用$1返回第一个正则表达式捕获组时,为什么会得到“移位”结果?

1 个答案:

答案 0 :(得分:4)

问题是$1是对最后一次正则表达式匹配中第一组匹配的引用。它的值在传递给方法(String#sub!)时评估,而不是在匹配完成后评估。

因此,t来自您之前使用\1的实验。如果您打开一个新的repl并运行第二个示例,您将获得TypeError: no implicit conversion of nil into String。这是因为当您拨打第一个$1时,nilString#sub!