Ответ 1
Здесь могут быть использованы разделители% q:
# %q(a string) is equivalent to a single-quoted string
puts "Cote d'Ivoir".gsub("'", %q(\\\')) #=> Cote d\'Ivoir
У меня есть очень большая строка, которая должна избегать всех одинарных кавычек в ней, поэтому я могу отправить ее на JavaScript, не нарушая ее. Я не контролирую внешнюю строку, поэтому я не могу изменить исходные данные.
Пример:
Cote d'Ivoir -> Cote d\'Ivoir
(фактическая строка очень длинная и содержит много одинарных кавычек)
Я пытаюсь сделать это, используя gsub
в строке, но не могу заставить это работать:
a = "Cote d'Ivoir"
a.gsub("'", "\\\'")
но это дает мне:
=> "Cote dIvoirIvoir"
Я также пробовал:
a.gsub("'", 92.chr + 39.chr)
но получил тот же результат; Я знаю, что это связано с регулярными выражениями, но я никогда не получаю их.
Здесь могут быть использованы разделители% q:
# %q(a string) is equivalent to a single-quoted string
puts "Cote d'Ivoir".gsub("'", %q(\\\')) #=> Cote d\'Ivoir
Проблема заключается в том, что \'
в замене gsub
означает "часть строки после совпадения".
Вероятно, вам лучше использовать либо синтаксис блока:
a = "Cote d'Ivoir"
a.gsub(/'/) {|s| "\\'"}
# => "Cote d\\'Ivoir"
или синтаксис хэша:
a.gsub(/'/, {"'" => "\\'"})
Там также хакерский обход:
a.gsub(/'/, '\#').gsub(/#/, "'")
# 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