2010-05-06 131 views
5

我不能为我的生活弄清楚这一点,尽管它应该很简单。红宝石 - 逃避括号

如何用"\(""\)"替换字符串上所有出现的"("")"

似乎没有任何工作:

"foo (bar) foo".gsub("(", "\(") # => "foo (bar) foo" 

"foo (bar) foo".gsub("(", "\\(") # => "foo \\(bar) foo" 

任何想法?

回答

4

你已经拥有的第二次尝试的解决方案,你只是感到困惑,因为字符串在交互式解释器中以转义形式显示。但是真的只有一个反斜杠没有两个。尝试使用看跌期权打印出来,你会看到有实际上只是一个反斜杠:

> "foo (bar) foo".gsub("(", "\\(") 
=> "foo \\(bar) foo" 
> puts "foo (bar) foo".gsub("(", "\\(") 
foo \(bar) foo 

如果您需要进一步的说服力,尝试以字符串的长度:

> "foo (bar) foo".length 
=> 15 
> "foo (bar) foo".gsub("(", "\\(").length 
=> 16 

如果它已添加两个反斜杠将打印17而不是16

+0

非常感谢你! – 2010-05-06 18:31:24

0

在用双引号创建的字符串中,\转义下一个字符。因此,为了在字符串中获得反斜杠,您需要跳过反斜杠本身:"\\("。或者您可以使用单引号字符串,该字符串的预处理较少:'\('

1

"foo (bar) foo".gsub("(", "\\\\(")确实有效。如果你在控制台尝试它,你可能会看到\\(字符串,因为控制台输出与检查字符串,转义\

尝试用:puts "foo (bar) foo".gsub("(", "\\("),你会看到

3

这就是我刚才在一个呼叫更换两括号:

str.gsub(/(\(|\))/,'\\\\\1')