2010-02-15 3 views
14

Я пытаюсь выяснить, как заменить цитату вроде ' с чем-то вроде \'.Заменить 'with ' в Ruby?

Как мне это сделать?

Я попытался

"'".gsub("'","\\'") 

, но он просто дает пустую строку. Что я здесь делаю неправильно?

+0

Я отредактировал мой ответ – marcgg

+0

Я надеюсь, что вы не пытаетесь избежать ввода SQL. Всегда «подготавливайте» свои заявления. –

+0

Нет, это экранирование кода, но не SQL. – Earlz

ответ

27

Как об этом

puts "'".gsub("'","\\\\'") 
\' 

Причина заключается в том, что \' означает послематчевой в GSUB (регулярное выражение) и из-за того, что она нуждается сбегать с \\' и \, очевидно, скрывается как \\, заканчивая \\\\'.

Пример

>> "abcd".gsub("a","\\'") 
=> "bcdbcd" 

a заменяется все после a.

+0

Спасибо за объяснение, что для меня .. Я думаю, gsub просто имеет некоторые скрытые «функции», – Earlz

-1

Как насчет делать это:

"'".gsub("\\","\\\\\\\\").gsub("'","\\\\'") 

Не очень, но я думаю, что это работает ...

+0

Деструктивная версия тоже не работает. просто возвращает пустую строку из подсказки irb – Earlz

+0

Хорошо, позвольте мне взглянуть на нее – marcgg

+0

Ruby версия 'ruby 1.8.6 (2009-06-08 patchlevel 369) [x86_64-openbsd4.6]' – Earlz

0

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

irb(main):039:0> "life's grand".gsub "'", "\\\'" 
=> "lifes grands grand" 
irb(main):040:0> "life's grand".gsub "'", "\\\\'" 
=> "life\\'s grand" 
+0

Да, это не имея смысла для меня .. Конечно, я мог бы использовать регулярное выражение для него, но это похоже на излишний. – Earlz

2

$' переменная строка справа от матча. В строке замены gsub той же переменной будет \' - отсюда проблема.

x = "'foo'" 
x.gsub!(/'/, "\\'") 
puts x.inspect  # foo'foo 

Это должно работать:

x = "'foo'" 
x.gsub!(/'/, "\\\\'") 
puts x.inspect 
puts x 
0

двухэтапный подход, который я фактически использовал ...

BACKSLASH = 92.chr 
temp = "'".gsub("'", "¤'") 
puts temp.gsub("¤", BACKSLASH) 
=> "\'" 

будет работать только тогда, когда «¤» не используется в тексте, очевидно ...