Techioz Blog

文字列検査で一重引用符を使用する

概要

次のプログラムがあります。

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'