我试图让这个方法调用:
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"]
现在,它正确识别撇号,但它错误地包含了句点。我不明白为什么。
答案 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"]
如果您只想匹配整个字词,则[[:alnum:]]+(?:[’'-][[:alnum:]]+)*
模式可以附加一个字边界 - \b
。
<强>详情:
[[:alnum:]]+
- 一个或多个字母数字符号(?:[’'-][[:alnum:]]+)*
- 零或更多(由于*
,根据要求替换为另一个量词)出现次数:
[’'-]
- 撇号或连字符(列表可能会调整_ [[:alnum:]]+
- 一个或多个字母数字符号。