如果你能保证你收到的格式为“[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]
在现实世界中,解析和验证电子邮件地址是要困难得多,所以如果你从企业电子邮件目录之外的某个来源提取电子邮件地址,它会变得非常混乱。一般来说,在做这类事情时,最好是用几行(或多行)代码来完成这项工作,在这些代码行中,将字符串拆分为看似合理的块,然后将其标准化(或修理)个人地址。
为什么不解决真正的问题,这是输入字符串的格式?不管产生的是什么,都是破坏的,恕我直言。 – 2011-01-12 19:04:50
输入字符串包含有效的电子邮件地址,并且采用通常收到的格式,例如从通过mbox文件解析的电子邮件中获取。 – 2011-01-13 01:37:51