2010-05-06 132 views
5

我不能爲我的生活弄清楚這一點,儘管它應該很簡單。紅寶石 - 逃避括號

如何用"\(""\)"替換字符串上所有出現的"("")"

似乎沒有任何工作:

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

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

任何想法?

回答

4

你已經擁有的第二次嘗試的解決方案,你只是感到困惑,因爲字符串在交互式解釋器中以轉義形式顯示。但是真的只有一個反斜槓沒有兩個。嘗試使用看跌期權打印出來,你會看到有實際上只是一個反斜槓:

> "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

+0

非常感謝你! – 2010-05-06 18:31:24

0

在用雙引號創建的字符串中,\轉義下一個字符。因此,爲了在字符串中獲得反斜槓,您需要跳過反斜槓本身:"\\("。或者您可以使用單引號字符串,該字符串的預處理較少:'\('

1

"foo (bar) foo".gsub("(", "\\\\(")確實有效。如果你在控制檯嘗試它,你可能會看到\\(字符串,因爲控制檯輸出與檢查字符串,轉義\

嘗試用:puts "foo (bar) foo".gsub("(", "\\("),你會看到

3

這就是我剛纔在一個呼叫更換兩括號:

str.gsub(/(\(|\))/,'\\\\\1')