2010-09-13 2 views
0

Я пытаюсь использовать String # gsub для добавления косой черты перед% или?, Которую я буду использовать в запросе LIKE. Я получаю некоторые странное поведение, которое, надеюсь, кто-то может объяснить:Как я могу избежать групповых символов базы данных в ruby?

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 (три обратные косые черты), поэтому для записи этого в виде строкового литерала требуется пять (действительно шесть) литеральных обратных косых черт.

Это, вероятно, случай, когда использование строк с двумя кавычками менее подвержено ошибкам.