文字列検査で一重引用符を使用する
概要
次のプログラムがあります。
args = ["a", "b"]
cmd_args = args.map{|x| x.inspect}
str = cmd_args.join(' ')
puts str
出力は次のとおりです。
"a" "b"
出力は次のようになると予想します (部分文字列は ” の代わりに ’ で引用されています)。
'a' 'b'
実際のシステムでは部分文字列に ” が含まれる可能性があるため、文字列検査の後に gsub を実行したくありません。次に例を示します。
args = ['a"c', "b"]
cmd_args = args.map{|x| x.inspect.gsub('"', '\'')}
str = cmd_args.join(' ')
puts str
出力されます:
'a\'c' 'b'
a と c の間の「」が誤って置き換えられています。期待される出力は次のとおりです。
'a"c' 'b'
文字列を ” の代わりに ’ で引用するように文字列検査を行うにはどうすればよいですか?
解決策
s = 'a"c'.inspect
s[0] = s[-1] = "'"
puts s.gsub("\\\"", "\"") #=> 'a"c'