2017-05-06 51 views
0

我有一个使用Ruby的应用程序,我可以使其工作。 我不能做的是相同的过滤器,但只是用upcase或downcase,所以我不必列出所有可能的选项。使用Ruby下载阵列

files = input_value 

files.reject!{|f| 
f.match(/MXF|mxf|MOV|mov|MP4|mp4|3G2|3g2|3GP|3gp|ASF|asf|AVI|avi|F4V|f4v|FLV|flv|M4V|m4v|M2TS|m2ts|MKV|mkv|MPEG|mpeg|MPG|mpg|MPV|mpv|MTS|mts|OGV|ogv|SVI|svi|VOB|vob|WEBM|webm|WMV|wmv|WAV|wav|MP3|mp3/).blank? 
} 
+1

如果你得到'mov.jpeg',会发生什么?使用'File.extname'来提取扩展名,使用它来进行简单的数组包含测试不是更好吗? –

+0

告诉我你的意思,我会尝试。并不是所有的东西都可以在我的Ruby应用中运行 – HelixHatter

+0

请看下面Cary的回答,这几乎是我想到的。 –

回答

2

为了提高效率i(不区分大小写,我想)选项,我建议你创建一个包含所需的文件扩展名集。确定一个集合是否包含一个给定的元素需要与确定一个散列是否具有给定的关键字大致相同的时间。它比单步执行数组要快得多。

require 'set' 

BAD_EXT = %w| mxf mov mp4 3g2 3gp asf avi f4v flv m4v m2ts mkv 
       mpeg mpg mpv mts ogv svi vob webm wmv wav mp3 |.to_set 
    #=> #<Set: {"mxf", "mov", "mp4", "3g2", "3gp", "asf", "avi", "f4v", 
    #   "flv", "m4v", "m2ts", "mkv", "mpeg", "mpg", "mpv", "mts", 
    #   "ogv", "svi", "vob", "webm", "wmv", "wav", "mp3"}> 

fnames = ["./Ruby/Cat.mov", "./Ruby/Dog.woof", "./Ruby/pig"] 

fnames.select { |fname| BAD_EXT.include?(File.extname(fname).downcase.sub(/\A\./, "")) } 
    #=> ["./Ruby/Cat.mov"] 

请参阅File::extname

注:

File.extname("abc.def") 
    #=> ".def" 
File.extname("abc") 
    #=> "" 

因此,有必要去除期间如果存在的话(...sub(/\A\./, ""))。

OP显然想要select这些扩展名的文件。见下面的评论。

+0

@ muistooshort,很好的建议。我做了改变。 –

+0

我正在构建一个白名单,并且需要返回原始值而没有任何大小写更改。 我只想使用这些扩展名的媒体文件。 是否使用fnames.reject!返回相反? – HelixHatter

+0

是的,你需要'select'或'select!'。 (我建议前者,除非你有充足的理由修改文件名的数组。)这两个方法将在这里返回原始文件名。我稍微改变了我的例子来证明这一点。 –

1

使用正则表达式

files.reject! do |f| 
    f.match /mxf|mov|mp4|3g2|3gp|asf|avi|f4v|flv|m4v|m2ts|mkv|mpeg|mpg|mpv|mts|ogv|svi|vob|webm|wmv|wav|mp3/i 
end 
+0

我添加了我的应用程序需要的调整,并根据您的建议,它的工作。谢谢 files = input_value files.reject!{| f | f.match(/ MXF | MOV | MP4 | 3G2 | 3GP | ASF | AVI | F4V | FLV | M4V | M2TS | MKV | MPEG |英里| MPV |山|远洋船| SVI | VOB | WEBM | WMV | WAV | MP3 /i).blank?} – HelixHatter

+0

我很高兴Sir :) – Ursus