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

cjm*_*671 10 regex ruby-on-rails

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

@from = "John Doe <john.doe@daemon.co.uk>"
Run Code Online (Sandbox Code Playgroud)

当我做:

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

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

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

任何帮助将非常感激.

Mar*_*ers 26

你的表达很好: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 } 
Run Code Online (Sandbox Code Playgroud)

输出:

john.doe@daemon.co.uk


lul*_*ala 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"
Run Code Online (Sandbox Code Playgroud)


小智 12

对不起,我没有足够的代表发表评论,所以我会回答这个问题:

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

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

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

因此,任何人都不应该限制TLD长度(尽管留下至少2个字符仍然是好的).