Я пытаюсь понять, как заменить цитату типа '
чем-то вроде \'
.
Как бы я это сделал?
я пытался
"'".gsub("'","\\'")
но он просто дает пустую строку. Что я здесь делаю неправильно?
Я пытаюсь понять, как заменить цитату типа '
чем-то вроде \'
.
Как бы я это сделал?
я пытался
"'".gsub("'","\\'")
но он просто дает пустую строку. Что я здесь делаю неправильно?
Как насчет этого
puts "'".gsub("'","\\\\'")
\'
Причина в том, что \'
означает post-match в gsub (regex), и из-за этого его нужно экранировать с помощью \\'
, а \
, очевидно, экранируется как \\
, заканчивая \\\\'
.
Пример
>> "abcd".gsub("a","\\'")
=> "bcdbcd"
a
заменяется всем после a
.
Переменная $'
— это строка справа от совпадения. В строке замены gsub
той же самой переменной будет \'
— отсюда и проблема.
x = "'foo'"
x.gsub!(/'/, "\\'")
puts x.inspect # foo'foo
Это должно работать:
x = "'foo'"
x.gsub!(/'/, "\\\\'")
puts x.inspect
puts x
Это может быть ошибка.. Или, по крайней мере, что-то, что нарушает МОЕ представление о принципе наименьшего удивления.
irb(main):039:0> "life's grand".gsub "'", "\\\'"
=> "lifes grands grand"
irb(main):040:0> "life's grand".gsub "'", "\\\\'"
=> "life\\'s grand"
Двухэтапный подход, который я фактически использовал...
BACKSLASH = 92.chr
temp = "'".gsub("'", "¤'")
puts temp.gsub("¤", BACKSLASH)
=> "\'"
Будет работать только в том случае, если '¤' явно не используется в тексте...
Как насчет этого:
"'".gsub("\\","\\\\\\\\").gsub("'","\\\\'")
Некрасиво, но я думаю, что это работает...
ruby 1.8.6 (2009-06-08 patchlevel 369) [x86_64-openbsd4.6]
- person Earlz; 15.02.2010