给出如下字符串:
Bob Smith <bobsmith@gmail.com>, Jones, Rich A. <richjones@gmail.com>, \
peterbaker@gmail.com
我需要生成一个这样的字符串:
"Bob Smith" <bobsmith@gmail.com>, "Jones, Rich A." <richjones@gmail.com>,\
peterbaker@gmail.com
(反斜杠\只表示该行仍在继续,并没有真正破坏。)
这与Need to wrap certain parts of a string of email addresses in quotes有关,但我需要修改问题。
请注意,并非所有电子邮件地址都带有斜角括号并附有全名。
答案 0 :(得分:1)
如果您可以保证您收到的所有电子邮件地址的格式都是“user@host.domain”,那么它会更容易一些:
require 'pp'
addr_str = 'Bob Smith <bobsmith@gmail.com>, Jones, Rich A. <richjones@gmail.com>, peterbaker@gmail.com'
parsed_addresses = addr_str.scan(/\s*([\w., ]*?)\s*?(<?\w+@[\w.]+>?),?/)
pp parsed_addresses
# >> [["Bob Smith", "<bobsmith@gmail.com>"],
# >> ["Jones, Rich A.", "<richjones@gmail.com>"],
# >> ["", "peterbaker@gmail.com"]]
pp parsed_addresses.map{ |name, email| [%Q{"#{name}"}, email] }
# >> [["\"Bob Smith\"", "<bobsmith@gmail.com>"],
# >> ["\"Jones, Rich A.\"", "<richjones@gmail.com>"],
# >> ["\"\"", "peterbaker@gmail.com"]]
puts parsed_addresses.map{ |name, email| [%Q{"#{name}"}, email] }
# >> "Bob Smith"
# >> <bobsmith@gmail.com>
# >> "Jones, Rich A."
# >> <richjones@gmail.com>
# >> ""
# >> peterbaker@gmail.com
在现实世界中,解析和验证电子邮件地址要困难得多,因此如果您从企业电子邮件目录之外的某些来源提取电子邮件地址,则会变得非常混乱。
一般来说,在做这类事情的时候,最好不要期望在几行(或多行)代码中执行此操作,将字符串拆分为看似合理的块,然后进行规范化(或修复)个人地址。
答案 1 :(得分:1)
这是一个可以处理任意电子邮件地址甚至多个逗号的解决方案(例如“Jones,Jr。,Winston A.”)。我没有尝试大规模的正则表达式,而是将其拆分为多个部分,并将那些不完整的电子邮件地址与下一部分组合在一起。
input = "Bob Smith <bobsmith@gmail.com>, Jones, Rich A. <richjones@gmail.com>, peterbaker@gmail.com"
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" <bobsmith@gmail.com>
"Jones, Rich A." <richjones@gmail.com>
peterbaker@gmail.com
要获得您指定的确切输出,请将.join(", ")
附加到上面的最后一行代码。
答案 2 :(得分:0)
s/(^|\s)([[:alpha:]].*?)(\s*<.*?>\s*(,|$))/$1"$2"$3/g
这种关系似乎介于"Name" <email>,
之间。所以,你对Name(特别是)的了解越多,它就越好。