使用正则表达式从除撇号之外的字符串中去除所有字符和标点符号

时间:2017-06-09 13:46:02

标签: ruby regex

我试图让这个方法调用:

alternate_words(". . . .  don’t let this stop you")

返回字符串中的每个其他单词,除了'之外,减少标点符号。

这是方法定义:

def alternate_words(sentence)
  sentence.gsub(/[^a-z0-9\s']/i, "").split(" ").delete_if.with_index 
  {|word,index| index.odd? }
end

结果是:

["dont", "this", "you"]

返回正确的字词,但不包含'。将正则表达式更改为:

/[^a-z0-9\s][']/i

返回

[".", ".", "don’t", "this", "you"]

现在,它正确识别撇号,但它错误地包含了句点。我不明白为什么。

1 个答案:

答案 0 :(得分:0)

您实际上匹配带有scan的撇号和连字符的字词:

def alternate_words(sentence)
  sentence.scan(/[[:alnum:]]+(?:[’'-][[:alnum:]]+)*/).delete_if.with_index { |_,index| 
    index.odd? 
  }
end

p alternate_words(". . . . .  don’t let this stop you")
# => ["don’t", "this", "you"]

查看Ruby demo

如果您只想匹配整个字词,则[[:alnum:]]+(?:[’'-][[:alnum:]]+)*模式可以附加一个字边界 - \b

<强>详情:

  • [[:alnum:]]+ - 一个或多个字母数字符号
  • (?:[’'-][[:alnum:]]+)* - 零或更多(由于*,根据要求替换为另一个量词)出现次数:
    • [’'-] - 撇号或连字符(列表可能会调整_
    • [[:alnum:]]+ - 一个或多个字母数字符号。