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

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
hzxu 3 Май 2019 в 09:35

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/ 
3
Cary Swoveland 3 Май 2019 в 06:55

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

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

Это собирается сделать по существу то же самое. Хотя рубин говорит, матч быстрее

1
Sudipta Mondal 3 Май 2019 в 07:39
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"]
0
Rajagopalan 3 Май 2019 в 06:50