简单 - 使用字符串#扫描,提取电子邮件地址

问题描述:

我有一个包含字符串:简单 - 使用字符串#扫描,提取电子邮件地址

@from = "John Doe <[email protected]>" 

当我这样做:

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

我没有得到任何结果。我试图自行提取电子邮件地址。

我试图消除\ B的,但这也不能工作。

任何帮助将不胜感激。

你表达正常工作:rubular

的问题是在你的正则表达式的报价意味着它被解释为纯文本字符串,而不是一个正则表达式。删除引号解决了这个问题:ideone

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

输出:

 
[email protected] 
+1

正则表达式/的定义之间,所以如果你把里面的字符串引用红宝石不会使它一个正则表达式,而是会只认准纯文本。 –

对不起,我没有足够的代表处发表评论,所以我会做这样一个答案:

对于任何将来的使用,每个人都应该做一个修改:不要限制TLD长度4.新*域名正在推出非常迅速,现在您应该使用这样的正则表达式:

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

我所做的只是去掉4在正则表达式,这使在TLD的4个字符的最大长度结束。 TLD几乎都是2,3或4个字符(.com,.org,.info等)。但现在,他们正在推出大量的新产品(.auction,.software,.business等)。

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

对于那些谁只需要对付像地址"John Doe <[email protected]>",其中可能包含的显示名称。

使用Ruby的Mail::Address类。

require 'mail' 
#=> true 
a = Mail::Address.new("John Doe <[email protected]>") 
#=> #<Mail::Address:70264542184500 Address: |John Doe <[email protected]>| > 
a.address 
#=> "[email protected]" 
a.display_name 
#=> "John Doe" 
+1

我最近一直在使用它,但是偶然发现了一个UTF8字符似乎不受支持的bug:https://github.com/mikel/mail/issues/1014 ... – Nick