我不能爲我的生活弄清楚這一點,儘管它應該很簡單。紅寶石 - 逃避括號
如何用"\("
和"\)"
替換字符串上所有出現的"("
和")"
?
似乎沒有任何工作:
"foo (bar) foo".gsub("(", "\(") # => "foo (bar) foo"
"foo (bar) foo".gsub("(", "\\(") # => "foo \\(bar) foo"
任何想法?
我不能爲我的生活弄清楚這一點,儘管它應該很簡單。紅寶石 - 逃避括號
如何用"\("
和"\)"
替換字符串上所有出現的"("
和")"
?
似乎沒有任何工作:
"foo (bar) foo".gsub("(", "\(") # => "foo (bar) foo"
"foo (bar) foo".gsub("(", "\\(") # => "foo \\(bar) foo"
任何想法?
你已經擁有的第二次嘗試的解決方案,你只是感到困惑,因爲字符串在交互式解釋器中以轉義形式顯示。但是真的只有一個反斜槓沒有兩個。嘗試使用看跌期權打印出來,你會看到有實際上只是一個反斜槓:
> "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
在用雙引號創建的字符串中,\
轉義下一個字符。因此,爲了在字符串中獲得反斜槓,您需要跳過反斜槓本身:"\\("
。或者您可以使用單引號字符串,該字符串的預處理較少:'\('
。
"foo (bar) foo".gsub("(", "\\\\(")
確實有效。如果你在控制檯嘗試它,你可能會看到\\(
字符串,因爲控制檯輸出與檢查字符串,轉義\
嘗試用:puts "foo (bar) foo".gsub("(", "\\(")
,你會看到
這就是我剛纔在一個呼叫更換兩括號:
str.gsub(/(\(|\))/,'\\\\\1')
非常感謝你! – 2010-05-06 18:31:24