2010-09-13 75 views
0

我正在嘗試使用String#gsub在%或?之前添加一個斜槓,然後我將在LIKE查詢中使用它。我收到一些奇怪的行爲,希望有人能解釋一下:我怎樣才能逃避紅寶石數據庫通配符?

irb(main):018:0> "%?".gsub(/([%\?])/, '\1') 
=> "%?" 
irb(main):019:0> "%?".gsub(/([%\?])/, '\\1') 
=> "%?" 
irb(main):020:0> "%?".gsub(/([%\?])/, '\\\1') 
=> "\\1\\1" 
irb(main):021:0> "%?".gsub(/([%\?])/, '\\\\1') 
=> "\\1\\1" 

我已經只是做字符串使用兩個單獨的gsubs圍繞這個工作的時刻,但我非常想知道,如果任何人都可以解釋這是怎麼回事!

回答

2

你停你的目標一個短:)

>> '%?'.gsub(/([%\?])/, '\\\\\1') 
=> "\\%\\?" 

Single-quoted strings in Ruby不接受轉義字符,所以'\1''\\1'被解析一樣的,都是'\\\1''\\\\1'。你想通過gsub參數\\\1(三個反斜槓),所以需要5個(真正的6個)字面反斜槓來將它寫成字符串。

這可能是使用雙引號字符串不太容易出錯的一種情況。