2011-01-12 34 views
0

给定一个字符串,如这样的:需要包装的电子邮件地址中引号的字符串的某些部分(第2版)

Bob Smith <[email protected]>, Jones, Rich A. <[email protected]>, \ 
[email protected] 

我需要制作一个像这样的字符串:

"Bob Smith" <[email protected]>, "Jones, Rich A." <[email protected]>,\ 
[email protected] 

(反斜杠\只是意味着线条继续存在,并没有真正打破。)

这与Need to wrap certain parts of a string of email addresses in quotes有关,但我需要修改该问题。

请注意,并非所有电子邮件地址都将放在斜角括号内,并附有全名。

+1

为什么不解决真正的问题,这是输入字符串的格式?不管产生的是什么,都是破坏的,恕我直言。 – 2011-01-12 19:04:50

+0

输入字符串包含有效的电子邮件地址,并且采用通常收到的格式,例如从通过mbox文件解析的电子邮件中获取。 – 2011-01-13 01:37:51

回答

1

这是一个可以处理任意电子邮件地址甚至多个逗号(例如“Jones,Jr.,Winston A.”)的解决方案。我不是尝试一个大规模的正则表达式,而是将它分成几部分,并将不完整的电子邮件地址与下一部分进行分组。

input = "Bob Smith <[email protected]>, Jones, Rich A. <[email protected]>, [email protected]" 
parts = input.split /\s*,\s*/ 

addrs = [] 
savebin = "" 

#Group the parts together 
parts.each do |part| 
    if part.include? "@" 
    addrs << savebin + part 
    savebin = "" 
    else 
    savebin = part + ", " 
    end 
end 

#Quote the names 
puts addrs.map { |addr| addr.gsub(/^(.*) (<.*)/, '"\1" \2') } 

输出是:

"Bob Smith" <[email protected]> 
"Jones, Rich A." <[email protected]> 
[email protected] 

为了让你指定的确切输出,追加.join(", ")上面的代码的最后一行。

0

s/(^|\s)([[:alpha:]].*?)(\s*<.*?>\s*(,|$))/$1"$2"$3/g

的关系似乎是"Name" <email>,之间。所以,你对名称(特别是)的了解越多,它就越好。

1

如果你能保证你收到的格式为“[email protected]”的所有电子邮件地址,然后它会更容易一些:

require 'pp' 

addr_str = 'Bob Smith <[email protected]>, Jones, Rich A. <[email protected]>, [email protected]' 

parsed_addresses = addr_str.scan(/\s*([\w., ]*?)\s*?(<?\[email protected][\w.]+>?),?/) 
pp parsed_addresses 

# >> [["Bob Smith", "<[email protected]>"], 
# >> ["Jones, Rich A.", "<[email protected]>"], 
# >> ["", "[email protected]"]] 

pp parsed_addresses.map{ |name, email| [%Q{"#{name}"}, email] } 

# >> [["\"Bob Smith\"", "<[email protected]>"], 
# >> ["\"Jones, Rich A.\"", "<[email protected]>"], 
# >> ["\"\"", "[email protected]"]] 

puts parsed_addresses.map{ |name, email| [%Q{"#{name}"}, email] } 

# >> "Bob Smith" 
# >> <[email protected]> 
# >> "Jones, Rich A." 
# >> <[email protected]> 
# >> "" 
# >> [email protected] 

在现实世界中,解析和验证电子邮件地址是要困难得多,所以如果你从企业电子邮件目录之外的某个来源提取电子邮件地址,它会变得非常混乱。一般来说,在做这类事情时,最好是用几行(或多行)代码来完成这项工作,在这些代码行中,将字符串拆分为看似合理的块,然后将其标准化(或修理)个人地址。

相关问题