Ruby:过滤器数组删除列入黑名单的名称

时间:2019-05-03 06:35:40

标签: arrays ruby string

说我有很多句子:

sentences = ["Tom is a good person", "Jack spent some time", "Kat did something wrong"]

我有一个黑名单名称:

blacklist = ["Jack", "Kat"]

现在,我需要将sentences过滤到一个数组中,以删除所有包含黑名单名称的句子,因此:

["Tom is a good person"]

我将如何在Ruby中做到这一点?

谢谢!

3 个答案:

答案 0 :(得分:3)

sentences = ["Tom is a good person", "Jack spent some time", "Kat did something wrong",
             "Kathy knows her stuff"]

blacklist = ["Jack", "Kat"]

r = /\b#{Regexp.union(blacklist)}\b/
  #=> /\b(?-mix:Jack|Kat)\b/
sentences.reject { |s| s.match?(r) }
  #=> ["Tom is a good person", "Kathy knows her stuff"]

在正则表达式中需要分词(\b),以便"Kat""Kathy"的前三个字母不匹配。可以这样写:

r = /\b#{blacklist.join('|')}\b/
  #=> /\bJack|Kat\b/ 

答案 1 :(得分:1)

您只需要拒绝记录

sentences.reject!{|sentence| sentence.match(blacklist.join('|'))}

您将获得所需的输出-

["Tom is a good person"]

拒绝文档! -https://ruby-doc.org/core-2.2.0/Array.html#method-i-reject-21

reject!将更新同一数组,如果您不希望这样做,则可以使用reject并将其存储在新数组中。

返回=~ :)

sentences.reject!{|sentence| !((Regexp.new(blacklist.join('|')) =~ sentence).nil?) }

如果`=〜'找到匹配项,则拒绝该句子(使用的代码-!nil?)

这基本上会做同样的事情。尽管红宝石说,比赛更快

答案 2 :(得分:0)

sentences = ["Tom is a good person", "Jack spent some time", "Kat did something wrong"]

blacklist = ["Jack", "Kat"]

程序

p sentences.filter{|string|!(blacklist.map{|x|string.match?(x)}.any?)}

如果您使用的是

p sentences.select{|string|!(blacklist.map{|x|string.include?(x)}.any?)}

结果

["Tom is a good person"]