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

时间:2011-05-28 02:44:37

标签: ruby regex

我试图在简短的Ruby脚本中转义括号和括号。该脚本将目录的名称作为参数,在目录中创建.mp3s的播放列表,并从目录中命名播放列表。

如果目录有大括号或括号,它会在没有错误的情况下失败,它只是没有制作播放列表。这是代码:

  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)但它仍然无法使用.gsub!。此外,我宁愿不逃避他们,我想要包括他们的标题。 Regexp.escape会成为答案吗?

编辑:澄清一下,轨道名称不必是完整路径,因为播放列表将与轨道本身位于同一目录中。见:http://en.wikipedia.org/wiki/M3U

1 个答案:

答案 0 :(得分:4)

以下内容应该有效:

escaped_path = path.gsub(/([\[\]\{\}\*\?\\])/, '\\\\\1')
tracks = Dir["#{escaped_path}/*.mp3"]

我通过查看Dir.glob的API来确定需要转义的字符。正则表达式很复杂,因为在正则表达式中也使用相同的字符!

与您的括号问题分开,您有一个更大的问题。你基本上像Schlemiel the Painter那样反复重写m3u文件。最好在轨道循环之外打开文件句柄。