需要将一串电子邮件地址的某些部分用引号括起来(版本2)

时间:2011-01-12 18:12:52

标签: ruby regex

给出如下字符串:

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有关,但我需要修改问题。

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

3 个答案:

答案 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(特别是)的了解越多,它就越好。