2011-12-01 86 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中。 –