字符类有重复的范围:/正则表达式的电子邮件/

时间:2014-09-14 05:22:40

标签: ruby regex web-scraping mechanize anemone

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文章。

1 个答案:

答案 0 :(得分: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\-]