2016-01-22 28 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

謝謝您的詳細解釋! –