首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >解析数组以查找单个单词,大小写是相关的

解析数组以查找单个单词,大小写是相关的
EN

Stack Overflow用户
提问于 2019-06-03 05:23:49
回答 4查看 67关注 0票数 1

下面是我正在做的练习。

应该返回其中每个脏话的元音都替换为'*'“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
EN

回答 4

Stack Overflow用户

发布于 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
票数 1
EN

Stack Overflow用户

发布于 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
票数 0
EN

Stack Overflow用户

发布于 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上获得此类问题的更好回答。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56419043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档