Заменить «на \» в Ruby?

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

Как бы я это сделал?

я пытался

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

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


person Earlz    schedule 15.02.2010    source источник
comment
Надеюсь, вы не пытаетесь избежать ввода SQL. Всегда «готовьте» свои заявления.   -  person ko-dos    schedule 15.02.2010
comment
Нет, это код экранирования, но не SQL.   -  person Earlz    schedule 15.02.2010


Ответы (5)


Как насчет этого

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

Причина в том, что \' означает post-match в gsub (regex), и из-за этого его нужно экранировать с помощью \\', а \, очевидно, экранируется как \\, заканчивая \\\\'.

Пример

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

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

person Jonas Elfström    schedule 15.02.2010
comment
Спасибо, что объяснили это для меня. Я думаю, у gsub просто есть некоторые скрытые функции. - person Earlz; 15.02.2010

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

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

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

x = "'foo'"
x.gsub!(/'/, "\\\\'")
puts x.inspect
puts x
person FMc    schedule 15.02.2010

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

irb(main):039:0> "life's grand".gsub "'", "\\\'"
=> "lifes grands grand"
irb(main):040:0> "life's grand".gsub "'", "\\\\'"
=> "life\\'s grand"
person Trevoke    schedule 15.02.2010
comment
Да, это не имеет для меня смысла... конечно, я мог бы использовать для этого регулярное выражение, но это кажется излишним. - person Earlz; 15.02.2010

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

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

Будет работать только в том случае, если '¤' явно не используется в тексте...

person Torbjørn    schedule 15.02.2010

Как насчет этого:

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

Некрасиво, но я думаю, что это работает...

person marcgg    schedule 15.02.2010
comment
Деструктивная версия тоже не работает. просто возвращает пустую строку из подсказки irb - person Earlz; 15.02.2010
comment
Рубиновая версия ruby 1.8.6 (2009-06-08 patchlevel 369) [x86_64-openbsd4.6] - person Earlz; 15.02.2010