如何在Ruby中转义括号和括号?

问题描述

| 我试图在简短的Ruby脚本中转义括号和方括号。该脚本将目录名称作为参数,在目录中创建.mp3的播放列表,然后从目录中命名播放列表。 如果目录带有花括号或括号,则该目录将失败而不会出现错误,它只是不会创建播放列表。这是代码
  1 #!/usr/bin/ruby -w
  2 
  3 # create a playlist for a specified directory of .mp3 files
  4 
  5 puts \"enter path to album:\"
  6 chomped = gets.chomp
  7 path = File.expand_path(\"#{chomped}\")
  8 
  9 data = \"#EXTM3U\\n\"
 10 tracks = Dir[\"#{path}/*.mp3\"]
 11 name = path.sub(/.*\\/(.*)/,\"\\\\1\")
 12 name.gsub!(/_/,\" \")
 13 name.gsub!(/(\\A|\\s)\\w/) { |c| c.upcase }
 14 tracks.sort.each do |track|
 15     track_name = track.sub(/.*\\/(.*)/,\"\\\\1\")
 16     data += \"#EXTINF:\\n\" + track_name + \"\\n\"
 17 end
 18 File.open(\"#{path}/#{name}.m3u\",\"a\") { |f| f.write data }
 19 puts \"created #{path}/#{name}.m3u\"
我已经能够转义下划线,并且我想我得到了一个正则表达式来转义其他字符(http://rubular.com/r/BNUnjsde6J),但是使用ѭ1仍然失败。另外,我也不想逃脱它们,我希望标题包括它们。
Regexp.escape
是答案吗? 编辑:为了澄清,轨道名称不必是完整路径,因为播放列表将与轨道本身位于同一目录中。请参阅:http://en.wikipedia.org/wiki/M3U     

解决方法

        以下应该工作:
escaped_path = path.gsub(/([\\[\\]\\{\\}\\*\\?\\\\])/,\'\\\\\\\\\\1\')
tracks = Dir[\"#{escaped_path}/*.mp3\"]
通过查看Dir.glob的API,我确定了需要转义的字符。正则表达式很复杂,因为正则表达式中也使用相同的字符! 除了括号问题之外,您还有一个更大的问题。基本上,您就像画家Schlemiel一样,一遍又一遍地重写m3u文件。最好在track循环之外打开文件句柄。