47

我有一个非常大的字符串,需要转义其中的所有单引号,所以我可以将它提供给 JavaScript 而不会打乱它。我无法控制外部字符串,因此无法更改源数据。

例子:

Cote d'Ivoir  -> Cote d\'Ivoir  

(实际字符串很长,包含很多单引号)

我正在尝试通过gsub在字符串上使用来实现这一点,但无法使其正常工作:

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

但这给了我:

=> "Cote dIvoirIvoir"

我也试过:

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

但得到了相同的结果;我知道这与正则表达式有关,但我从来没有得到那些。

4

3 回答 3

59

%q 定界符在这里派上用场:

# %q(a string) is equivalent to a single-quoted string
puts "Cote d'Ivoir".gsub("'", %q(\\\')) #=> Cote d\'Ivoir
于 2012-05-11T13:43:48.027 回答
22

问题在于替换\'中的gsub意思是“匹配后的字符串的一部分”。

您可能最好使用块语法:

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

或哈希语法:

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

还有一个hacky解决方法:

a.gsub(/'/, '\#').gsub(/#/, "'")
于 2012-05-11T13:13:48.757 回答
0
# 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
于 2019-06-26T14:05:26.300 回答