我的任务是用'you'
替换字符串中'u'
,'youuuu'
和'u'
(数字为'your sister'
)的所有实例。< / p>
这是我的代码:
def autocorrect(input)
words = input.split()
words.each do |word|
if word == 'u' || word == 'you'
word.replace 'your sister'
elsif word.include? 'you'
word.replace 'your sister'
end
end
words = words.join(' ')
words
end
我的代码正确替换了这个单词,但它也删除了标点符号。我明白了:
autocorrect("I miss you!")
# => "I miss your sister"
输出中没有惊叹号。有人知道为什么会这样吗?
答案 0 :(得分:2)
当您在ruby中拆分带有空格的字符串时,它会使用标点符号。
尝试分割像&#34这样的句子;我喜欢糖果!&#34;并检查最后一个元素。你会注意到它是“糖果”这个词!&#34;感叹号和所有。
答案 1 :(得分:1)
我认为使用替换,您可以使用gsub,将you
替换为您的妹妹,这样可以保留感叹号。
因为replace
将替换正在传递的整个字符串,例如:
p 'you!'.replace('your sister') # => "your sister"
p 'you!'.gsub(/you/, 'your sister') # => "your sister!"
所以你可以试试:
def autocorrect(input)
words = input.split()
words.each do |word|
if word == 'u' || word == 'you'
word.replace 'your sister'
elsif word.include? 'you'
word.gsub!(/you/, 'your sister')
end
end
words = words.join(' ')
words
end
p autocorrect("I miss you!")
# => "I miss your sister!"
请注意,只需在输入中使用gsub即可获得预期的输出。
答案 2 :(得分:1)
部分基于对问题的评论,我假设要替换的子字符串不能立即在字母之前或之后。
r = /
(?<!\p{alpha}) # do not match a letter (negative lookbehind)
(?: # begin non-capture group
you+ # match 'yo' followed by one of more 'u's
| # or
u # match 'u'
) # close non-capture group
(?!\p{alpha}) # do not match a letter (negative lookahead)
/x # free-spacing regex definition mode
"uyou you youuuuuu &you% u ug".gsub(r, "your sister")
#=> "uyou your sister your sister &your sister% your sister ug"
这个正则表达式是按惯例编写的
/(?<!\p{alpha})(?:you+|u)(?!\p{alpha})/