And*_*imm 8 ruby glob ruby-1.9
如果使用File :: FNM_EXTGLOB选项,则最新版本的Ruby支持在globbing中使用大括号
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,而不是本地文件系统,所以我不能只是要求操作系统根据我的知识进行通配.
这是一个有趣的 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 进行测试。
| 归档时间: |
|
| 查看次数: |
266 次 |
| 最近记录: |