简单 - 使用String#scan提取电子邮件地址

时间:2011-11-21 22:05:55

标签: ruby-on-rails regex

我有一个包含以下内容的字符串:

@from = "John Doe <john.doe@daemon.co.uk>"

当我这样做时:

@from.scan('/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i')

我没有结果。我正在尝试自己提取电子邮件地址。

我尝试删除\ b,但这也不起作用。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:24)

你的表情很好:rubular

问题是正则表达式周围的引号意味着它被解释为纯文本字符串而不是正则表达式。删除引号可以解决问题:ideone

@from = "John Doe <john.doe@daemon.co.uk>"
@from.scan(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i) { |x| puts x } 

输出:

john.doe@daemon.co.uk

答案 1 :(得分:13)

对于那些只需要处理"John Doe <john.doe@daemon.co.uk>"等可能包含显示名称的地址的人。

使用Ruby Mail::Address类。

require 'mail'
#=> true
a = Mail::Address.new("John Doe <john.doe@daemon.co.uk>")
#=> #<Mail::Address:70264542184500 Address: |John Doe <john.doe@daemon.co.uk>| >
a.address
#=> "john.doe@daemon.co.uk"
a.display_name
#=> "John Doe"

答案 2 :(得分:12)

抱歉,我没有足够的代表发表评论,所以我会回答:

对于将来的使用,每个人都应该进行一次修改:不要将TLD长度限制为4.新TLD的引入非常迅速,您现在应该使用这样的正则表达式:

@from.scan(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/i)

我所做的就是删除正则表达式末尾的4,它在TLD上最多包含4个字符。 TLD过去几乎都是2个,3个或4个字符(.com,.org,.info等)。但现在,他们正在推出大量新的(.auction,.software,.business等)。

所以没有人应该再限制TLD长度了(尽管留下至少2个字符仍然很好)。