Если вы можете гарантировать, что все полученные вами адреса электронной почты отформатированы как «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
В реальном мире парсинг и проверка адресов электронной почты намного сложнее, поэтому может быть очень сложно, если вы извлекаете адреса электронной почты из какого-либо источника вне каталога электронной почты вашего предприятия.
В общем, когда вы делаете подобные вещи, лучше ожидать, что это будет сделано в несколько (или много) строк кода, где вы разбиваете строку на части, которые кажутся разумными, а затем нормализуете (или восстанавливаете ) отдельные адреса.