2013-06-27 5 views
34

これは普通の繰り返しのイディオムです:正規表現を使って配列をフィルタリングし、サブ配列を返す。私のアプローチはRubyのようなものではないようです(私はJavaから来ています)。私はこのように多く見える多くの方法を持つことになります。Ruby:正規表現によるフィルター配列?

このコードを改善するための慣用的なRubyの方法は何ですか?

def get_all_gifs(items_) 
    output = Array.new 
    filter = /\.jpg$/ 
    items_.each do |item| 
    next if item =~ filter 
    output << item 
    end 
    output 
end 
+0

あなたはどのようになっているファイル名を使用しますか? 'Dir.glob( '* .jpe?g')' –

+0

を使用して名前を取得するときに、ディスクからフィルタリングできる場合は、ほとんどの人が私の質問を誤解していると思います。この例はあまりにも負荷がかかるかもしれません。これは、イメージやファイル名やファイル拡張子に関するものではありません。配列のフィルタリング、それを行うメソッドのよりよいイディオムについてです。 – allanberry

答えて

55

あなたはすべてのGIFを検索する場合:

それらを実行
def get_all_jpgs(files) 
    files.select{ |i| i[/\.jpe?g$/] } 
end 

files = %w[foo.gif bar.jpg foo.jpeg bar.gif] 
get_all_gifs(files) # => ["foo.gif", "bar.gif"] 
get_all_jpgs(files) # => ["bar.jpg", "foo.jpeg"] 

しかし、待って、あなたがすべてのJPEGファイルを検索する場合

def get_all_gifs(files) 
    files.select{ |i| i[/\.gif$/] } 
end 

を!もっとたくさん!あなたはそのタイプによってグループにそれらすべてをしたい場合は、その拡張子に基づいて抽出何

?:

def get_all_images_by_type(files) 
    files.group_by{ |f| File.extname(f) } 
end 

ここでは、ファイルの種類だ:ここで

get_all_images_by_type(files).keys # => [".gif", ".jpg", ".jpeg"] 

は、特定のタイプをつかむ方法です:

get_all_images_by_type(files) # => {".gif"=>["foo.gif", "bar.gif"], ".jpg"=>["bar.jpg"], ".jpeg"=>["foo.jpeg"]} 
get_all_images_by_type(files)['.gif'] # => ["foo.gif", "bar.gif"] 
get_all_images_by_type(files).values_at('.jpg', '.jpeg') # => [["bar.jpg"], ["foo.jpeg"]] 
15
$ cat foo.rb 
images = %w[foo.gif foo.png foo.jpg bar.jpeg moo.JPG] 
jpgs = images.select{|e| e =~ /\.jpe?g$/i} 
puts jpgs.inspect 

$ ruby foo.rb 
["foo.jpg", "bar.jpeg", "moo.JPG"] 

あなたは関係なく、例「JPG」に加えて「JPEG」を一致させることができるようにあなたの正規表現への変更があります。

+1

"select"メソッドは、私がここで探しているものです(または、むしろ "reject"メソッドで、これで見つけたものです)。ありがとう。 – allanberry

18

Enumerable.grepをご覧ください。これは、非常に強力な検索方法です列挙可能なものの中に抱かれている。

+0

これはディケンズのように機能します。これからはおそらくこれを使用しますが、狭い意味では「選択」方法はこの質問の後にあります。どうもありがとう。 – allanberry

+0

はい、 'grep'は受信者の要素と' grep'の引数とを比較するために '==='を使うために役に立ちます。たとえば、 '[" abc "、" bcd "、" cbd "]。grep(/ .b。/)#=> [" abc "、" cbd "]'と '[{a :1}、4、{b:2}、 "hat"]。grep(Hash)#=> [{:a => 1}、{:b => 2}] ' –

3

この特定の問題については、regexせずに行けます。 String#end_with?

images = %w[foo.gif foo.png foo.jpg bar.jpeg moo.JPG] 
images.find_all{|e| e.end_with?(".jpg",".jpeg")} 
# => ["foo.jpg", "bar.jpeg"] 
9
images = %w[foo.gif foo.png foo.jpg bar.jpeg moo.JPG] 
images.grep(/.jpg/g) # => ["foo.jpg", "moo.JPG"] 
0
ta, tb = files.partition{|f| f[/(.*\.jpe*g)/]} 

ap ta 
[ 
    [0] "bar.jpg", 
    [1] "foo.jpeg" 
] 


ap tb 
[ 
    [0] "foo.gif", 
    [1] "bar.gif" 
] 

/gucio