我在更长的脚本中使用它,但一个简短的例子将说明我遇到的问题类型。
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
返回第一个正则表达式捕获组时,为什么会得到“移位”结果?
答案 0 :(得分:4)
问题是$1
是对最后一次正则表达式匹配中第一组匹配的引用。它的值在传递给方法(String#sub!
)时评估,而不是在匹配完成后评估。
因此,t
来自您之前使用\1
的实验。如果您打开一个新的repl并运行第二个示例,您将获得TypeError: no implicit conversion of nil into String
。这是因为当您拨打第一个$1
时,nil
为String#sub!
。