下面是我正在做的练习。
应该返回其中每个脏话的元音都替换为'*'“do”的句子
示例#1检查(“天哪”,“天啊”,“该死”,“拍摄”) =>("G*sh d*rn it“)
示例#2检查器(“关闭前门”," DOOR“) =>(”关闭前门D**R")
我被难住的地方是如何解释这些上限。我最初开始遍历每个单词,但找不到使用.include之类的东西来检查该单词是否在数组中的最佳方法。
我从下面开始
def censor(sentence, curse)
vowels = "aeiouAEIOU"
result = ""
words = sentence.split(' ')
new_curse = curse.join(",")
p new_curse.downcase
p words
words.each.with_index do ???
if word.casecmp?()
word.each_char do |char|
if vowels.include?(char)
result << "*"
else
result << char
end
end
else
result << word
end
end
return result
end
发布于 2019-06-03 11:25:47
不需要将字符串拆分成单词,编辑每个单词,然后将它们重新连接在一起以形成新的字符串。
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
发布于 2019-06-03 10:13:02
这就是我最终得到的结果,也许还有更好的方法,所以如果是这样,请让我知道。我被小写,大写,第一个字符大写所困扰,而我应该只拿一支钢笔和铅笔来解决它。
def get_stared(word)
vowels = "aeiou"
result = ""
word.each_char do |char|
if vowels.include?(char.downcase)
result += "*"
else
result += char
end
end
result
end
def censor(sentence, curse_words)
words = sentence.split(" ")
new_words = words.map do |word|
if curse_words.include?(word.downcase)
get_stared(word)
else
word
end
end
new_words.join(" ")
end
发布于 2019-06-03 10:57:22
如果你利用ruby的内置功能,这可以做得更好:
def censor(sentence, curse)
curse_re = Regexp.new(Regexp.union(curse).source, 'i')
sentence.split(' ').map do |word|
curse_re.match(word) ? word.gsub(/[aeiou]/i, '*') : word
end.join(' ')
end
这对您的两个测试用例都有效:Try it online!
i
标志使元音忽略大小写,并且curse_re
将匹配任何咒骂单词,也忽略大小写。
为了便于将来参考,您将在SE codereview site上获得此类问题的更好回答。
https://stackoverflow.com/questions/56419043
复制相似问题