在Ruby 1.9.3上使用大括号进行Globbing

And*_*imm 8 ruby glob ruby-1.9

如果使用File :: FNM_EXTGLOB选项,则最新版本的Ruby支持在globbing中使用大括号

2.2.0文档

File.fnmatch('c{at,ub}s', 'cats', File::FNM_EXTGLOB) #=> true  # { } is supported on FNM_EXTGLOB
Run Code Online (Sandbox Code Playgroud)

但是,1.9.3文档说它在1.9.3中不受支持:

File.fnmatch('c{at,ub}s', 'cats')       #=> false # { } isn't supported
Run Code Online (Sandbox Code Playgroud)

(另外,尝试使用File::FNM_EXTGLOB给出了一个名称错误)

有没有办法在Ruby 1.9.3中使用大括号,比如第三方gem?

我想要匹配的字符串来自S3,而不是本地文件系统,所以我不能只是要求操作系统根据我的知识进行通配.

Eri*_*nil 0

这是一个有趣的 Ruby 练习!不知道这个解决方案对您来说是否足够强大,但这里是:

class File
  class << self
    def fnmatch_extglob(pattern, path, flags=0)
      explode_extglob(pattern).any?{|exploded_pattern|
        fnmatch(exploded_pattern,path,flags)
      }
    end

    def explode_extglob(pattern)
      if match=pattern.match(/\{([^{}]+)}/) then
        subpatterns = match[1].split(',',-1)
        subpatterns.map{|subpattern| explode_extglob(match.pre_match+subpattern+match.post_match)}.flatten
      else
        [pattern]
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

需要更好的测试,但它似乎适用于简单的情况:

[2] pry(main)> File.explode_extglob('c{at,ub}s')
=> ["cats", "cubs"]
[3] pry(main)> File.explode_extglob('c{at,ub}{s,}')
=> ["cats", "cat", "cubs", "cub"]
[4] pry(main)> File.explode_extglob('{a,b,c}{d,e,f}{g,h,i}')
=> ["adg", "adh", "adi", "aeg", "aeh", "aei", "afg", "afh", "afi", "bdg", "bdh", "bdi", "beg", "beh", "bei", "bfg", "bfh", "bfi", "cdg", "cdh", "cdi", "ceg", "ceh", "cei", "cfg", "cfh", "cfi"]
[5] pry(main)> File.explode_extglob('{a,b}c*')
=> ["ac*", "bc*"]
[6] pry(main)> File.fnmatch('c{at,ub}s', 'cats')
=> false
[7] pry(main)> File.fnmatch_extglob('c{at,ub}s', 'cats')
=> true
[8] pry(main)> File.fnmatch_extglob('c{at,ub}s*', 'catsssss')
=> true
Run Code Online (Sandbox Code Playgroud)

使用 Ruby 1.9.3、Ruby 2.1.5 和 2.2.1 进行测试。