您好我正在构建一个函数,让我在字符串中使用“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"
我不知道如何让最后一部分正确,我想不出一个好的方法来使用。任何帮助将不胜感激。
答案 0 :(得分:1)
您使用代码时遇到的问题是,您致电input.split(" ")
但未将其保存到任何内容,然后检查input == "u" # ...
和{{1仍然是整个字符串,因此,如果您调用input
或autocorrect('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"