我不能为我的生活弄明白这一点,即使它应该很简单。
如何使用"("
和")"
替换字符串上所有出现的"\("
和"\)"
?
似乎没有任何作用:
"foo ( bar ) foo".gsub("(", "\(") # => "foo ( bar ) foo"
"foo ( bar ) foo".gsub("(", "\\(") # => "foo \\( bar ) foo"
有什么想法吗?
答案 0 :(得分:4)
您已经有了第二次尝试的解决方案,您只是感到困惑,因为字符串在交互式解释器中以转义形式显示。但实际上只有一个反斜杠,而不是两个。尝试使用puts打印它,你会发现实际上只有一个反斜杠:
> "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。
答案 1 :(得分:3)
以下是我在一次通话中用来取代父母的原因:
str.gsub(/(\(|\))/,'\\\\\1')
答案 2 :(得分:1)
在使用双引号创建的字符串中,\
将转义下一个字符。因此,为了在字符串中得到反斜杠,您需要转义反斜杠本身:"\\("
。或者你可以使用单引号字符串,它可以减少预处理:'\('
。
答案 3 :(得分:1)
"foo ( bar ) foo".gsub("(", "\\\\(")
确实有用。如果你在控制台中尝试它,你可能会看到\\(
字符串,因为控制台输出带有inspect的字符串,它会逃脱\
尝试使用:puts "foo ( bar ) foo".gsub("(", "\\(")
,您会看到