2011-12-01 48 views
4

我们的应用程序有一个邀请页面,用户可以在其中导入他们的地址簿。我们使用外部服务来获取它们,所以它只是把结果放到textarea中。我们一开始只是用逗号分割的结果,并很快想通了,是不会因为工作:解析地址簿中的电子邮件

"Smith, Joe" <[email protected]>, "Jackson, Joe" <[email protected]> 

这将在2个条目之间的工作,但也被分成里面他们。只是想知道是否有一个众所周知的傻瓜式的方式来完成这项工作。

也许正则表达式会工作吗?我很糟糕的是,任何人都可以提示我从什么正则表达式将只提取电子邮件到一个数组...

事情是这样的:

emails = recipients.scan(/.*@.*/) <<==== but i know that's not right 

编辑

看起来像这可能工作。任何人有任何建议,这是否会在特殊情况下工作:

emails = recipients.scan(/[a-z0-9_.-][email protected][a-z0-9-]+\.[a-z.]+/i) 
+1

将它们视为引用的CSV数据,也许... –

+0

因此,您不在乎名称,您只是想提取电子邮件地址? –

+1

没错。我有这个,这似乎赶上我发送给它的一切: /[a-z0-9+_.-][email protected][a-z0-9-]+.[az.0-9-]+/ i – user577808

回答

4
ruby-1.9.3-p0 :055 > a = '"Smith, Joe" <[email protected]>, "Jackson, Joe" <[email protected]>'; 
ruby-1.9.3-p0 :056 > b = a.scan(/<(.*?)>/).flatten 
=> ["[email protected]", "[email protected]"] 
ruby-1.9.3-p0 :057 > c = a.scan(/"(.*?)"/).flatten 
=> ["Smith, Joe", "Jackson, Joe"] 

每个数组中的名称/电子邮件索引是相同的,因此c [1]是b [1]电子邮件的名称。

基于您的评论怎么样他:

ruby-1.9.3-p0 :008 > a = '"Smith, Joe" <[email protected]>, "Jackson, Joe" <[email protected]>'; 
ruby-1.9.3-p0 :009 > b = '"[email protected], [email protected]"'; 
ruby-1.9.3-p0 :010 > b.scan(/\w*@\w*\.\w*/) 
=> ["[email protected]", "[email protected]"] 
ruby-1.9.3-p0 :011 > a.scan(/\w*@\w*\.\w*/) 
=> ["[email protected]", "[email protected]"] 

这是相当多,你添加到你的问题一样,只是更紧凑。

+0

谢谢。问题在于格式可能与简单的“[email protected],[email protected]”(没有< >)并且不能保持。我想我找到了一个正则表达式,可以正确地提取电子邮件,但是stackoverflow不会让我回答我自己的问题。 – user577808

+0

扫描(/ \ w * @ \ w * \。\ w * /)不适用于像“[email protected]”这样的邮件地址。 – GiridharBandi

0

你可以尝试用下面的正则表达式

,(?=(?:[^"]*"[^"]*")*[^"]*$) 

本书虽然是拆,这不是一个最佳的快速解决方案,并可能成为多头缓慢字符串,更好地使用专门的分析器。引用引用可能是该解决方案的一个问题,具体取决于它们如何被转义(如果有的话)。

3

Kassym的版本将在各种情况下失败,包括对包含非单词字符的任何电子邮件地址(例如[email protected]

解析电子邮件列表不能使用正则表达式来完成。使用的东西与真正的解析器,像mail宝石:

require "mail" 

Mail::AddressList.new(address_list).addresses.map(&:address) 

EZ!

+0

这似乎是一个很好的建议。是否值得将这整个gem纳入解析电子邮件地址?这就是我现在需要的应用程序,我想知道是否应该将它包含在我的Gemfile中。 –