web-dev-qa-db-ja.com

Rubyの文字列で、二重および単一の円記号をエスケープします

WindowsプラットフォームのRubyスクリプトで、このような形式でネットワークパスにアクセスしようとしています。

\\servername\some windows share\folder 1\folder2\

これをパスとして使用しようとすると、機能しません。このスクリプトでは、単一の円記号が適切にエスケープされていません。

path = "\\servername\some windows share\folder 1\folder2\"
d = Dir.new(path)

パス内のスラッシュを適切にエスケープするために、考えられるすべてのことを試みました。ただし、特別な意味があるため、その1つの円記号を回避することはできません。一重引用符、二重引用符、バックスラッシュ自体をエスケープし、%Q {}や%q {}などの代替引用符を使用し、ASCIIから文字への変換を使用してみました。私が正しくやっていないという意味では何も機能しません。 :-)現時点での一時的な解決策は、そのパスを指すネットワークドライブN:\をマップし、その方法でアクセスすることですが、それは解決策ではありません。

誰かが単一のバックスラッシュを適切にエスケープする方法を知っていますか?

ありがとうございました

16
konung

次のように、すべてのバックスラッシュを2倍にするだけです。

"\\\\servername\\some windows share\\folder 1\\folder2\\"
23
John Douthat

これを試して

puts '\\\\servername\some windows share\folder 1\folder2\\'
#=> \\servername\some windows share\folder 1\folder2\

文字列を定義するために一重引用符を使用している限り(例:'foo')、単一の\をエスケープする必要はありません。 次の2つの場合を除く

  1. \\は単一の\になります。したがって、\\\\は、必要な開始\\を提供します。
  2. パスの最後にある\は終了引用符をエスケープしようとするため、そこにも\\が必要です。

または、

エレガントなヘルパーを自分で定義できます。不格好な\パスセパレータを使用する代わりに、次のようなメソッドと組み合わせて/を使用できます。

def windows_path(foo)
  foo.gsub('/', '\\')
end

puts windows_path '//servername/some windows share/folder 1/folder2/'
#=> \\servername\some windows share\folder 1\folder2\

甘い!

13
maček