我正在尝试用ruby 1.9.3和1.8.7中字符串中的转义单引号(\')替换单引号(')。
确切的问题字符串是“您确定要删除'%@'”。此字符串应变为“您确定要删除\'%@ \'”
使用.gsub!(/ \'/,“\'”)会产生以下字符串“你确定要%@'%@”。
有关正在发生的事情的任何想法?
答案 0 :(得分:7)
String#gsub
形式的 gsub(exp,replacement)
有奇怪的怪癖影响替换字符串,有时需要大量的转义斜杠。 Ruby用户经常被指示使用块形式:
str.gsub(/'/){ "\\'" }
如果您想完全取消转义,请考虑使用备用字符串文字形式:
str.gsub(/'/){ %q(\') }
一旦习惯了这些类型的文字,使用它们来避免转义序列可以使你的代码更具可读性。
答案 1 :(得分:1)
\'
表示“匹配后原始字符串的部分”。因此str.gsub!(/\'/,"\\'")
会将'
字符替换为其后的所有内容 - 这就是您所注意到的内容。
你需要进一步逃避替换中的反斜杠。 .gsub(/'/,"\\\\'")
适用于我的irb
控制台:
irb(main):059:0> puts a.gsub(/'/,"\\\\'")
Are you sure you want to delete \'%@\'
答案 2 :(得分:0)
你需要逃避反斜杠。那怎么样?
"Are you sure you want to delete '%@'".gsub(/(?=')/, "\\")
# => "Are you sure you want to delete \\'%@\\'"
以上应该是你想要的。您的预期结果是错误的。当字面意思是反斜杠时,没有办法真正看到一个反斜杠。