使用reduce在ruby中修改字符串中的某些单词

时间 2019-02-21
阅读 66
点赞 0
收藏 0
连接patrick-duvall
keywords = ["fish", "blue"]
phrase = 'one fish two fish red fish blue fish'
actual = ???

assert_equal 'one FISH two FISH red FISH BLUE FISH', actual

简而言之,使用reduce,我应该替换什么????上面有。

总之,是否有一种方法可以使用reduce来修改字符串中满足某个条件的每个单词。在这种情况下,我想upcase每个word在里面phrase包括在keywords. 我可以想象,通过一些修改,我可以使用这个方法删除或替换一个单词的每个实例。我知道subgsub但我正在做一个问题集,这让我相信这是有可能的减少。我去看医生了,没用。

我只对使用reduce的解决方案感兴趣,或者对reduce在这种情况下不起作用的原因进行解释。

我用它来工作。

actual = keywords.reduce('one fish two fish red fish blue fish'){|memo,word| memo.gsub(word,word.upcase) }

加勒特的评论引导我走上了正确的方向。我可能不清楚,起初我只是不想gsub解决方案超出reduce. 谢谢你的帮助!

建议答案

有几种方法可以做到这一点。两者都是为了相对高效和共享方法。String#gsub正则表达式:

r = /\p{Alpha}+/

这与一个或多个Unicode字母匹配。

keywords = ["fish", "blue"]
phrase = "one fish two Fish red fisH blue fish."

注意,在我将第一个“fish”大写后,在第二个“fish”中加上了“h”,并添加了一个句点。

使用的形式String#gsub使用哈希进行替换

subs = keywords.each_with_object({}) { |word,h|
  h[word] = word.capitalize }
  #=> {"fish"=>"Fish", "blue"=>"Blue"} 
subs.default_proc = Proc.new { |_,word|
  subs.include?(word.downcase) ? word.upcase : word } 
  #=> #<Proc:0x000059dc26dd1510@(irb):95> 
phrase.gsub(r, subs)
  #=> "one Fish two FISH red FISH Blue Fish." 

默认过程返回一个字符串,如果word不是的键subs. 如果word.downcase是一把钥匙subsword.upcase被退回;否则word返回时不变。见Hash#default_proc=.

使用集合加速查找

require 'set'

subs = keywords.to_set
  #=> #<Set: {"fish", "blue"}> 
phrase.gsub(r) { |word|
  subs.include?(word.downcase) ? word.upcase : word }
  #=> "one FISH two FISH red FISH BLUE FISH."  
👍 0