Подтвердить что ты не робот

Заменить одиночную кавычку с помощью обратной косой черты

У меня есть очень большая строка, которая должна избегать всех одинарных кавычек в ней, поэтому я могу отправить ее на JavaScript, не нарушая ее. Я не контролирую внешнюю строку, поэтому я не могу изменить исходные данные.

Пример:

Cote d'Ivoir  -> Cote d\'Ivoir  

(фактическая строка очень длинная и содержит много одинарных кавычек)

Я пытаюсь сделать это, используя gsub в строке, но не могу заставить это работать:

a = "Cote d'Ivoir"
a.gsub("'", "\\\'")

но это дает мне:

=> "Cote dIvoirIvoir"

Я также пробовал:

a.gsub("'", 92.chr + 39.chr)

но получил тот же результат; Я знаю, что это связано с регулярными выражениями, но я никогда не получаю их.

4b9b3361

Ответ 1

Здесь могут быть использованы разделители% q:

# %q(a string) is equivalent to a single-quoted string
puts "Cote d'Ivoir".gsub("'", %q(\\\')) #=> Cote d\'Ivoir

Ответ 2

Проблема заключается в том, что \' в замене gsub означает "часть строки после совпадения".

Вероятно, вам лучше использовать либо синтаксис блока:

a = "Cote d'Ivoir"
a.gsub(/'/) {|s| "\\'"}
# => "Cote d\\'Ivoir"

или синтаксис хэша:

a.gsub(/'/, {"'" => "\\'"})

Там также хакерский обход:

a.gsub(/'/, '\#').gsub(/#/, "'")

Ответ 3

# prepare a text file containing [  abcd\'efg  ]
require "pathname"
backslashed_text = Pathname("/path/to/the/text/file.txt").readlines.first.strip
# puts backslashed_text => abcd\'efg

unslashed_text = "abcd'efg"
unslashed_text.gsub("'", Regexp.escape(%q|\'|)) == backslashed_text # true
# puts unslashed_text.gsub("'", Regexp.escape(%q|\'|)) => abcd\'efg