替换字符串中的单词并重新加入它们

时间:2017-08-23 03:39:21

标签: ruby string replace split

您好我正在构建一个函数,让我在字符串中使用“u”或“you”的任何实例并将其替换为特定的单词。我可以进入并隔离实例没问题,但我无法正确输出文字。到目前为止,我有。

def autocorrect(input)

 #replace = [['you','u'], ['your sister']]
 #replace.each{|replaced| input.gsub!(replaced[0], replaced[1])}
 input.split(" ")

 if (input == "u" && input.length == 1) || input == "you"
   input.replace("your sister")
 end

 input.join(" ")
end

理想的输出是:

autocorrect("I am so smitten with you")

"I am smitten with your sister"

我不知道如何让最后一部分正确,我想不出一个好的方法来使用。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您使用代码时遇到的问题是,您致电input.split(" ")但未将其保存到任何内容,然后检查input == "u" # ...和{{1仍然是整个字符串,因此,如果您调用inputautocorrect('u'),则会返回autocorrect('you')以下一行:{{1}会抛出错误。

此错误是因为,请记住"your sister"仍然是原始字符串,而不是每个单词的数组,并且字符串不具有input.join(" ")方法。

要使您的代码尽可能少地进行更改,您可以将其更改为:

input

所以,现在, 在您join输入后对每个单词执行某些操作,并且您正在针对def autocorrect(input) #replace = [['you','u'], ['your sister']] #replace.each{|replaced| input.gsub!(replaced[0], replaced[1])} input.split(" ").map do |word| if (word == "u" && word.length == 1) || word == "you" "your sister" else word end end.join(" ") end split(" ")检查每个单词,而不是整个输入字符串。然后映射替换单词或原始单词,然后将它们连接回单个字符串以返回它们。

作为替代方法,您可以使用String#gsub作为第二个参数进行替换:

  

如果第二个参数是Hash,匹配的文本是其中一个键,则相应的值是替换字符串。

"u"

该示例中的正则表达式看起来像:

"you"

Hash是任何单词边界。

答案 1 :(得分:0)

简单的数组映射可以完成这项任务:

"I am u so smuitten with utopia you".split(' ').map{|word| %w(you u).include?(word) ? 'your sister' : word}.join(' ')
#=> "I am your sister so smuitten with utopia your sister"

你的方法是:

def autocorrect(input)
  input.split(' ').map{|word| %w(you u).include?(word) ? 'your sister' : word}.join(' ')
end

autocorrect("I am so smitten with you")
#=> "I am smitten with your sister"