如何过滤数组,基于类似' * .rb'

时间:2014-06-01 01:20:58

标签: ruby

这是我的数据结构:

array = [

 ['foo.rb', 'file', '2432'],
 ['bar/', 'directory', '2048'],
 ['bla.yml', 'file', '10'],
 ['ble.rb', 'file', '2156']
]

现在我希望找到所有.rb文件。

我的过滤器看起来像这样:

filter = '*.rb'

有没有办法在数组变量上正确过滤?

结果应为:

array = [
 ['foo.rb', 'file', '2432'],
 ['ble.rb', 'file', '2156']
]

如果它是通过Dir.glob()它会很容易,但这是一个类似数组 数据结构,我有点困惑,我很容易 过滤它。

4 个答案:

答案 0 :(得分:1)

array.select{|x| x[0].end_with?(".rb") }

答案 1 :(得分:1)

您可以使用File.fnmatch?对任何字符串执行shell样式的文件名通配:

files = [ [ 'foo.rb', 'file', '2432' ],
          [ 'bar/', 'directory', '2048' ],
          [ 'bla.yml', 'file', '10' ],
          [ 'ble.rb', 'file', '2156' ]
        ]

pattern = "*.rb"

files.select do |filename,|
  File.fnmatch?(pattern, filename)
end
# => [ [ 'foo.rb', 'file', '2432' ],
#      [ 'ble.rb', 'file', '2156' ] ]

请注意do |filename,|中的逗号。这只是语法糖,它丢弃了除数组的第一个元素以外的所有元素,使得该块等效于:

files.select do |arr|
  filename = arr[0]
  File.fnmatch?(pattern, filename)
end

答案 2 :(得分:0)

>> array.find_all { |finfo| finfo[0].end_with?(".rb") }
=> [["foo.rb", "file", "2432"], ["ble.rb", "file", "2156"]]

答案 3 :(得分:0)

您还可以使用方法File.extname

array = [
          ['foo.rb', 'file', '2432'],
          ['bar/', 'directory', '2048'],
          ['bla.yml', 'file', '10'],
          ['ble.rb', 'file', '2156']
        ]

array.select { |a| File.extname(a.first) == '.rb' }
# => [["foo.rb", "file", "2432"], ["ble.rb", "file", "2156"]]