我不能为我的生活弄清楚这一点,尽管它应该很简单。红宝石 - 逃避括号
如何用"\("
和"\)"
替换字符串上所有出现的"("
和")"
?
似乎没有任何工作:
"foo (bar) foo".gsub("(", "\(") # => "foo (bar) foo"
"foo (bar) foo".gsub("(", "\\(") # => "foo \\(bar) foo"
任何想法?
我不能为我的生活弄清楚这一点,尽管它应该很简单。红宝石 - 逃避括号
如何用"\("
和"\)"
替换字符串上所有出现的"("
和")"
?
似乎没有任何工作:
"foo (bar) foo".gsub("(", "\(") # => "foo (bar) foo"
"foo (bar) foo".gsub("(", "\\(") # => "foo \\(bar) foo"
任何想法?
你已经拥有的第二次尝试的解决方案,你只是感到困惑,因为字符串在交互式解释器中以转义形式显示。但是真的只有一个反斜杠没有两个。尝试使用看跌期权打印出来,你会看到有实际上只是一个反斜杠:
> "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
在用双引号创建的字符串中,\
转义下一个字符。因此,为了在字符串中获得反斜杠,您需要跳过反斜杠本身:"\\("
。或者您可以使用单引号字符串,该字符串的预处理较少:'\('
。
"foo (bar) foo".gsub("(", "\\\\(")
确实有效。如果你在控制台尝试它,你可能会看到\\(
字符串,因为控制台输出与检查字符串,转义\
尝试用:puts "foo (bar) foo".gsub("(", "\\(")
,你会看到
这就是我刚才在一个呼叫更换两括号:
str.gsub(/(\(|\))/,'\\\\\1')
非常感谢你! – 2010-05-06 18:31:24