Ruby: массив фильтров по регулярному выражению?
Это обычная, повторяющаяся идиома для меня: фильтрация массива с использованием регулярного выражения и возвращение подматрицы. Мой подход не кажется очень похожим на Ruby (я прихожу из Java). В итоге у меня много методов, которые очень похожи на это.
Что такое идиоматический способ Ruby для улучшения этого кода?
def get_all_gifs(items_)
output = Array.new
filter = /\.jpg$/
items_.each do |item|
next if item =~ filter
output << item
end
output
end
Ответы
Ответ 1
Если вы хотите найти все gifs:
def get_all_gifs(files)
files.select{ |i| i[/\.gif$/] }
end
Если вы хотите найти все jpegs:
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"]
Но подождите! Там больше!
Что делать, если вы хотите сгруппировать их по типу, а затем извлечь на основе расширения?:
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"]]
Ответ 2
Посмотрите Enumerable.grep, это очень мощный способ поиска/фильтрации вещей во что-то перечислимом.
Ответ 3
$ 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"]
Изменение вашего регулярного выражения так, что вы можете сопоставить "jpeg" в дополнение к "jpg" независимо от случая.
Ответ 4
images = %w[foo.gif foo.png foo.jpg bar.jpeg moo.JPG]
images.grep(/.jpg/g) # => ["foo.jpg", "moo.JPG"]
Ответ 5
Мы можем пойти без регулярного выражения для этой конкретной проблемы. Используйте 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"]
Ответ 6
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