Нет необходимости разбивать строку на слова, редактировать каждое слово и затем соединять их вместе, чтобы сформировать новую строку.
def censor(sentence, coarse_words)
sentence.gsub(/\p{L}+/) { |word|
coarse_words.include?(word.downcase) ? word.gsub(/[aeiou]/i, '*') : word }
end
censor "Gosh darn it", ["gosh", "darn", "shoot"]
#=> "G*sh d*rn it"
censor "SHUT THE FRONT DOOR AFTER YOUR ARE OUTDOORS", ["door"]
#=> "SHUT THE FRONT D**R AFTER YOUR ARE OUTDOORS"
Для читателей, незнакомых с \p{L}
, выполните поиск Regexp . Это то же самое, что и \p{Alpha}
и [[:alpha:]]
, которые описаны в одном файле.
Если было отфильтровано большое количество текста, было бы эффективнее создать набор грубых слов:
require 'set'
def censor(sentence, coarse_words)
coarse_words_set = coarse_words.to_set
sentence.gsub(/\p{L}+/) { |word|
coarse_words_set.include?(word.downcase) ? word.gsub(/[aeiou]/i, '*') : word }
end
Если бы, кроме того, список грубых слов был статичным, можно было бы сделать набор грубых слов константой:
require 'set'
COARSE_WORDS = ["gosh", "darn", "shoot"].to_set
def censor(sentence)
sentence.gsub(/\p{L}+/) { |word|
COARSE_WORDS.include?(word.downcase) ? word.gsub(/[aeiou]/i, '*') : word }
end