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

Ruby 使用正则表达式从字符串中除去撇号以外的所有字符和标点符号,ruby,regex,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",

我试图让此方法调用:

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"]
现在,它正确地识别撇号,但它错误地包含句号。我不明白为什么。

实际上,您可以将带撇号的单词和连字符与
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:]+
    -1个或多个字母数字符号
  • (?:[''-][[:alnum:][]+)*
    -零或更多(由于
    *
    ,根据要求替换为另一个量词):
    • [''-]
      -撇号或连字符(列表可能会调整_
    • [[:alnum:]+
      -1个或多个字母数字符号
您实际上可以将带撇号的单词和连字符与
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:]+
    -1个或多个字母数字符号
  • (?:[''-][[:alnum:][]+)*
    -零或更多(由于
    *
    ,根据要求替换为另一个量词):
    • [''-]
      -撇号或连字符(列表可能会调整_
    • [[:alnum:]+
      -1个或多个字母数字符号

原始字符串中的内容看起来不像您在问题中提到的一个引号。
'''ʻ''
很容易相互误解。原始字符串中的内容看起来不像您在问题中提到的一个引号。
'''ʻ'
很容易相互误解。