Ruby: массив фильтров, удаляющий черные имена - PullRequest
0 голосов
/ 03 мая 2019

Скажите, у меня есть массив предложений:

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 ]

3 голосов
/ 03 мая 2019
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 голос
/ 03 мая 2019

Вам просто нужно отклонить записи

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

По сути, это будет то же самое.Хотя рубин говорит, что матч быстрее

0 голосов
/ 03 мая 2019
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?)}

Если вы используете

["Tom is a good person"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...