说我有很多句子:
sentences = ["Tom is a good person", "Jack spent some time", "Kat did something wrong"]
我有一个黑名单名称:
blacklist = ["Jack", "Kat"]
现在,我需要将sentences
过滤到一个数组中,以删除所有包含黑名单名称的句子,因此:
["Tom is a good person"]
我将如何在Ruby中做到这一点?
谢谢!
答案 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"]