Ruby - Escape括号

时间:2010-05-06 18:14:43

标签: ruby-on-rails ruby

我不能为我的生活弄明白这一点,即使它应该很简单。

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

似乎没有任何作用:

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

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

有什么想法吗?

4 个答案:

答案 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("(", "\\("),您会看到