2008-11-13 96 views
46

在Ruby中使用正则表达式时,$ 1和\ 1之间有什么区别?

回答

78

\ 1是反向引用,这将仅在同一subgsub方法调用工作,例如:

"foobar".sub(/foo(.*)/, '\1\1') # => "barbar" 

$ 1是一个全局变量,其可以在以后的代码被用于:

if "foobar" =~ /foo(.*)/ then 
    puts "The matching word was #{$1}" 
end 

输出:

"The matching word was bar" 
# => nil 
+0

请注意,尝试使用反向引用时,[Ruby对单引号和双引号的处理](http://stackoverflow.com/a/3028799/303896)可能会妨碍您的工作。 – alxndr 2016-05-13 22:29:24

+0

了解不多,有人可以提供一些更多解释 – YasirAzgar 2017-04-25 07:28:23

29

请记住,还有第三个选项,b锁形式sub。有时你需要它。假设你想用文本的相反替换一些文本。你不能使用$ 1,因为它没有束缚的速度不够快:

"foobar".sub(/(.*)/, $1.reverse) # WRONG: either uses a PREVIOUS value of $1, 
            # or gives an error if $1 is unbound 

你也不能使用\1,因为sub方法只是做的\1与适当的捕获文本的简单文本替换,没有魔法发生在这里:

"foobar".sub(/(.*)/, '\1'.reverse) # WRONG: returns '1\' 

所以,如果你想要做的任何幻想,你应该使用的sub块形式($ 1,$ 2,$`,$”等将可用):

"foobar".sub(/.*/){|m| m.reverse} # => returns 'raboof' 
"foobar".sub(/(...)(...)/){$1.reverse + $2.reverse} # => returns 'oofrab' 
相关问题