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(/'/, {"'" => "\\'"})

ハッキーな回避策もあります:

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 に答える