【问题标题】:Ruby: filter array removing blacklisted namesRuby:过滤数组删除列入黑名单的名称
【发布时间】:2019-09-21 16:24:32
【问题描述】:

假设我有一系列句子:

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

我有一个黑名单:

blacklist = ["Jack", "Kat"]

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

["Tom is a good person"]

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

谢谢!

【问题讨论】:

    标签: arrays ruby string


    【解决方案1】:
    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/ 
    

    【讨论】:

    • 谢谢让我试试。
    【解决方案2】:

    你只需要拒绝记录

    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?)

    这将基本上做同样的事情。虽然 ruby​​ 说,匹配更快

    【讨论】:

    • 我可能做错了什么,但它抱怨 match 没有定义。
    【解决方案3】:
    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"]
    

    【讨论】:

    • 对不起,我可能使用的是旧版本的 ruby​​ (2.3.7),我得到:undefined method filter' for #<0x00007f9bf4e796f8>
    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 2012-10-03
    • 2018-10-20
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    相关资源
    最近更新 更多