web-dev-qa-db-fra.com

Ruby: filtre de tableau par regex?

C'est un idiome commun et répétitif pour moi: filtrer un tableau à l'aide d'une expression régulière et renvoyer un sous-tableau. Mon approche ne semble pas très semblable à Ruby (je viens de Java). Je finis par avoir beaucoup de méthodes qui ressemblent beaucoup à ça.

Quelle est la manière idiomatique Ruby d'améliorer ce code?

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

Si vous voulez trouver tous les gifs:

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

Si vous voulez trouver tous les jpegs:

def get_all_jpgs(files)
  files.select{ |i| i[/\.jpe?g$/] }
end

Les exécuter:

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"]

Mais attendez! Il y a plus!

Que faire si vous souhaitez les regrouper tous par leur type, puis extraire en fonction de l'extension?:

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

Voici les types de fichiers:

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

Voici comment récupérer des types spécifiques:

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"]]
62
the Tin Man

Jetez un oeil à Enumerable.grep , c'est un moyen très puissant de trouver/filtrer les choses dans tout ce qui est énumérable.

21
steenslag
$ 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"]

La modification de votre expression régulière est pour que vous puissiez faire correspondre "jpeg" en plus de "jpg" quel que soit le cas.

16
Philip Hallstrom
images = %w[foo.gif foo.png foo.jpg bar.jpeg moo.JPG]
images.grep(/.jpg/i) # => ["foo.jpg", "moo.JPG"]
11
Timo Schilling

Nous pouvons aller sans regex pour ce problème spécifique. Utilisation 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"]
4
Arup Rakshit
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

0
gucio