2016-01-22 31 views
4

我想用反斜杠单引号(\')替换所有出现的单引号(')。我试着用gsub这样做,但我得到部分字符串重复:Gsub导致部分字符串被替换

a = "abc 'def' ghi" 
a.gsub("'", "\\'") 
# => "abc def' ghidef ghi ghi" 

有人可以解释为什么发生这种情况,什么解决这是什么?

+1

https://stackoverflow.com/questions/1542214/weird-backslash-substitution-in-ruby应该回答你的问题 – bjhaid

+0

感谢您的快速回复bjhaid!这回答了我的问题。你应该发布它作为答案。然后我可以提高你的评价。 –

回答

3

发生这种情况是因为"\\'"作为gsub的替代参数出现时具有特殊含义,即它表示匹配后的子字符串。

做你想做什么,你可以使用块:

注意反斜杠在字符串逃过检查,所以它显示为\\

+1

您不需要使用块表单;你只需要在另一个''''''前面​​加上另一个'''''',在双引号中看起来像''\\\\'“':'a.gsub(”'“,”\\\\ '“)' –

2

这是可能的,你只需要更高剂量逃逸的:

a.gsub(/'/, "\\\\'") 

结果

ABC \ '高清\' GHI

+1

这与a.gsub(”'“,”\\\'“) – Bunti

+0

相同,谢谢,它对我很有用。 –

3

"\\'"实际上代表文字\',因为反斜杠转义下一个反斜杠。而Ruby正则表达式中的文字\'实际上是一个特殊变量,它插入到匹配部分后面的字符串部分。所以这里发生了什么。

abc 'def' ghi 
    ^

插入点指向第一个匹配,'。将其替换为右边的所有东西,def' ghi

abc def' ghidef' ghi 
    ++++++++ 

现在找到下一场比赛:

abc def' ghidef' ghi 
      ^

再次,什么东西都在它的右边更换'ghi

abc def' ghidef ghi ghi 
       ++++ 
+0

谢谢您的详细解释! –