Заменить "с \" в Ruby? - PullRequest
       50

Заменить "с \" в Ruby?

14 голосов
/ 15 февраля 2010

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

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

Я пытался

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

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

Ответы [ 5 ]

28 голосов
/ 15 февраля 2010

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

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

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

Пример

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

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

3 голосов
/ 15 февраля 2010

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

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

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

x = "'foo'"
x.gsub!(/'/, "\\\\'")
puts x.inspect
puts x
0 голосов
/ 15 февраля 2010

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

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

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

0 голосов
/ 15 февраля 2010

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

irb(main):039:0> "life's grand".gsub "'", "\\\'"
=> "lifes grands grand"
irb(main):040:0> "life's grand".gsub "'", "\\\\'"
=> "life\\'s grand"
0 голосов
/ 15 февраля 2010

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

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

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

...