Я пытаюсь выяснить, как заменить цитату вроде '
с чем-то вроде \'
.Заменить 'with ' в Ruby?
Как мне это сделать?
Я попытался
"'".gsub("'","\\'")
, но он просто дает пустую строку. Что я здесь делаю неправильно?
Я пытаюсь выяснить, как заменить цитату вроде '
с чем-то вроде \'
.Заменить 'with ' в Ruby?
Как мне это сделать?
Я попытался
"'".gsub("'","\\'")
, но он просто дает пустую строку. Что я здесь делаю неправильно?
Как об этом
puts "'".gsub("'","\\\\'")
\'
Причина заключается в том, что \'
означает послематчевой в GSUB (регулярное выражение) и из-за того, что она нуждается сбегать с \\'
и \
, очевидно, скрывается как \\
, заканчивая \\\\'
.
Пример
>> "abcd".gsub("a","\\'")
=> "bcdbcd"
a
заменяется все после a
.
Спасибо за объяснение, что для меня .. Я думаю, gsub просто имеет некоторые скрытые «функции», – Earlz
Как насчет делать это:
"'".gsub("\\","\\\\\\\\").gsub("'","\\\\'")
Не очень, но я думаю, что это работает ...
Это может быть ошибка .. Или, по крайней мере, то, что разрушает представление об принцип наименьшего удивления.
irb(main):039:0> "life's grand".gsub "'", "\\\'"
=> "lifes grands grand"
irb(main):040:0> "life's grand".gsub "'", "\\\\'"
=> "life\\'s grand"
Да, это не имея смысла для меня .. Конечно, я мог бы использовать регулярное выражение для него, но это похоже на излишний. – Earlz
$'
переменная строка справа от матча. В строке замены gsub
той же переменной будет \'
- отсюда проблема.
x = "'foo'"
x.gsub!(/'/, "\\'")
puts x.inspect # foo'foo
Это должно работать:
x = "'foo'"
x.gsub!(/'/, "\\\\'")
puts x.inspect
puts x
двухэтапный подход, который я фактически использовал ...
BACKSLASH = 92.chr
temp = "'".gsub("'", "¤'")
puts temp.gsub("¤", BACKSLASH)
=> "\'"
будет работать только тогда, когда «¤» не используется в тексте, очевидно ...
Я отредактировал мой ответ – marcgg
Я надеюсь, что вы не пытаетесь избежать ввода SQL. Всегда «подготавливайте» свои заявления. –
Нет, это экранирование кода, но не SQL. – Earlz