繁体   English   中英

解析通讯簿中的电子邮件

[英]Parse emails from Address Book

我们的应用程序有一个邀请页面,用户可以在其中导入地址簿。 我们正在使用外部服务来获取它们,因此它只是将结果放入文本区域。 我们开始只是用逗号分割结果,并很快发现由于以下原因无法正常工作:

"Smith, Joe" <jsmith@example.com>, "Jackson, Joe" <jjackson@example.com>

它可以在2个条目之间工作,但也可以在它们内部分开。 只是想知道是否有一个众所周知的万无一失的方法来完成这项工作。

也许正则表达式会起作用? 我很糟糕,有人可以告诉我正则表达式会将电子邮件提取到一个数组......

像这样的东西:

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

编辑

看起来像这样的东西可能会起作用。 如果这适用于特殊情况,任何人都有任何建议:

emails = recipients.scan(/[a-z0-9_.-]+@[a-z0-9-]+\.[a-z.]+/i)
ruby-1.9.3-p0 :055 >   a = '"Smith, Joe" <jsmith@example.com>, "Jackson, Joe" <jjackson@example.com>';
ruby-1.9.3-p0 :056 >   b = a.scan(/<(.*?)>/).flatten
 => ["jsmith@example.com", "jjackson@example.com"] 
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" <jsmith@example.com>, "Jackson, Joe" <jjackson@example.com>';
ruby-1.9.3-p0 :009 >   b = '"test@domain.com, test2@domain.com"';
ruby-1.9.3-p0 :010 >   b.scan(/\w*@\w*\.\w*/)
 => ["test@domain.com", "test2@domain.com"] 
ruby-1.9.3-p0 :011 > a.scan(/\w*@\w*\.\w*/)
 => ["jsmith@example.com", "jjackson@example.com"] 

这与您添加到问题中的几乎相同,只是更紧凑。

Kassym的版本将在各种情况下失败,包括任何包含非单词字符的电子邮件地址(例如some.guy@gmail.com

使用正则表达式无法解析电子邮件列表。 使用真正的解析器,如邮件 gem:

require "mail"

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

EZ!

您可以尝试使用以下正则表达式进行拆分

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

虽然这不是一个最佳的快速解决方案,并且对于longs字符串来说可能很慢,最好使用专门的解析器。 引用引号可能是此解决方案的问题,具体取决于它们如何转义(如果有的话)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM