替换删除标点符号?

时间:2017-08-08 22:16:31

标签: ruby string replace

我的任务是用'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"

输出中没有惊叹号。有人知道为什么会这样吗?

3 个答案:

答案 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})/