2016-01-21 16 views
-1

我想解析一个我创建的数组,最终将“好”值写入文件。该阵列可以是这个样子,但内容可能会改变,所以我不能匹配某个值:Ruby if语句排除多个字符串变体

array = ["10.10.10.0/24", "10.10.10.1/32", "10.10.10.129/32", "127.0.0.0/8", "169.254.0.0/16", "192.168.1.0/24", "255.255.255.255/32"] 

我认为是有意义的检查前阵值写入文件和不写我知道我不想要的值。在这种情况下,该值将永远是:

10.10.10.1/32 
10.10.10.129/32 
127.0.0.0/8 
169.254.0.0/16 
255.255.255.255/32 

我最初if声明看起来是这样,这排序完成我所追求的,但不完全:

if !network.include?("/32" || "127.0.0.0/8" || "169.254.0.0/16" || "255.255.255.255/32") 
    file.write("#{network}\n") 
end 

导致(线2 & 3不应该被包括在内):

10.10.10.0/24 
127.0.0.0/8 
169.254.0.0/16 
192.168.1.0/24 

我有什么做WRO NG?有没有更好的方法来执行查找/匹配/排除?

+0

不清楚你的意思。 – sawa

回答

1
networks = ["10.10.10.0/24", "10.10.10.1/32", "10.10.10.129/32", "127.0.0.0/8", "169.254.0.0/16", "192.168.1.0/24", "255.255.255.255/32"] 
banned_networks = [/\/32/, "127.0.0.0/8", "169.254.0.0/16", "255.255.255.255/32"] 

networks.reject do |e| 
    case e 
    when *banned_networks 
    true 
    end 
end.each {|network| file.write("#{network}\n")} 
+0

太棒了!只需要对when语句行做一个小的编辑就可以使正则表达式工作。谢谢! – Godzilla74

+0

@ Godzilla74是的。也发现了这一点。几秒钟后会添加一些额外的东西。 –

1

您不能使用“或”||那样的。

更好

可能是......

exclude_entries = [ '/32', 
        '127.0.0.0/8', 
        '169.254.0.0/16', 
        '255.255.255.255/32' 
        ] 
match_pattern = Regex.new(exclude_entries.join('|')) 

(array.reject{|n| n =~ match_pattern}.each do |network| 
    file.write("#{network}\n") 
end 

的问题是表达"/32" || "127.0.0.0/8"总是返回 “/ 32” ...的 “或” 刚刚返回的第一个 “truthy” 的价值和“/ 32“是”truthy“

编辑为使用正则表达式以排除部分文本。

+0

将某些未知物放入exclude_entries数组的方式是什么?例如'/ 32',你会发现有几个地址以'/ 32'结尾。 – Godzilla74

+0

嗨,好的,编辑排除条目可以包含一个或多个部分。 – SteveTurczyn

+0

Ruby 2.3实现['Enumerable#grep_v'](http://ruby-doc.org/cor/Enumerable.html#method-i-grep_v)可以在这里使用,而不是'#reject':'array.grep_v (match_pattern)'。 – cremno