3

我正在尝试用 ruby​​ 1.9.3 和 1.8.7 中的字符串中的转义单引号 (\') 替换单引号 (')。

确切的问题字符串是“您确定要删除 '%@'”。这个字符串应该变成“你确定要删除\'%@\'”

使用 .gsub!(/\'/,"\'") 会导致以下字符串“Are you sure you want to %@'%@”。

关于发生了什么的任何想法?

4

3 回答 3

8

String#gsub表单gsub(exp,replacement)中有奇怪的怪癖影响替换字符串,有时需要大量转义斜杠。Ruby 用户经常被指示使用块形式:

str.gsub(/'/){ "\\'" }

如果您想完全取消转义,请考虑使用另一种字符串文字形式:

str.gsub(/'/){ %q(\') }

一旦你习惯了看到这些类型的文字,使用它们来避免转义序列可以使你的代码更具可读性。

于 2012-12-11T10:37:09.327 回答
1

\'在替换替换字符串中的意思是“匹配后的原始字符串部分”。所以用它之后str.gsub!(/\'/,"\\'")的所有东西替换'字符 - 这就是你所注意到的。

您需要在替换中进一步转义反斜杠。.gsub(/'/,"\\\\'")在我的irb控制台中工作:

irb(main):059:0> puts a.gsub(/'/,"\\\\'")
Are you sure you want to delete \'%@\'
于 2012-11-19T16:59:31.293 回答
0

您需要转义反斜杠。那这个呢?

"Are you sure you want to delete '%@'".gsub(/(?=')/, "\\")
# => "Are you sure you want to delete \\'%@\\'"

以上应该是你想要的。你的预期结果是错误的。当它的字面意思是反斜杠时,没有办法从字面上看到一个反斜杠。

于 2012-11-19T16:57:55.453 回答