【问题标题】:character class has duplicated range:/ regular expression of email/字符类有重复范围:/电子邮件的正则表达式/
【发布时间】:2014-09-14 05:22:39
【问题描述】:

xmpfilter 的结果

doc.search('.noimage p:nth-child(5)') do |kaipan|
    x = kaipan.to_s 
    x.scan(/[\w\d_-]+@[\w\d_-]+\.[\w\d._-]+/) #=>  # !> character class has duplicated range: /[\w\d_-]+@[\w\d_-]+\.[\w\d._-]+/
end

如果我不使用{do~end},这正是我所期望的。如下所示。

[9] pry(main)> doc.search('.noimage p:nth-child(5)').to_s.scan(/[\w\d_-]+@[\w\d_-]+\.[\w\d._-]+/)
=> ["xxxxxx@live.jp"]

在这里发帖让我再次意识到我的英语很烂……哈哈 我是日本人。 这是我在 Stackoverflow 上的第一篇文章。

【问题讨论】:

  • 你的正则表达式对我来说很好用。那有什么问题?最好是[\w-]+@[\w-]+\.[\w-]+
  • 欢迎来到 SO!有空的时候看看this faq

标签: ruby regex web-scraping mechanize anemone


【解决方案1】:

警告消息(它是警告而不是错误,只有在启用警告时才会看到)是character class has duplicated range。正则表达式中的字符类是[...] 中的内容,因此在您的情况下是[\w\d_-],并且警告告诉您它具有“重复范围”。这意味着字符类的一部分指定的字符与另一部分指定的字符相同。

如果我们将类分解成各个部分,\w[a-zA-Z0-9_] 相同(请参阅the Regexp docs),\d[0-9] 相同。但是0-9 已经包含在\w 中,所以这个范围是重复的,这就是警告告诉你的。 _ 也包含在\w 中,因此您可以将\d_ 排除在您的正则表达式之外并将其更改为[\w-],这应该具有相同的效果而没有警告。

另请注意,- 是字符类中的元字符,因此虽然它似乎在这里工作,但您可能会更安全地避开它:[\w\-]

【讨论】:

  • 正确的表达式是[\w-],因为当-[] 中的最后一个字符时,您不需要转义它。令人惊讶的是,Sintaro0221 实际上得到了正确的部分(尽管这可能是偶然的:p)。
猜你喜欢
  • 2021-12-19
  • 1970-01-01
  • 2010-11-03
  • 2010-11-18
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多