Вот немного другой подход, который работает лучше для меня.Он захватывает имя до или после адреса электронной почты и указывается ли адрес электронной почты в угловых скобках.
Я не пытаюсь отделить имя от фамилии - слишком проблематично(например, «Мэри Энн Смит» или «Доктор Мэри Смит»), но я исключаю дублирующиеся адреса электронной почты.
def parse_list(list)
r = Regexp.new('[a-z0-9\.\_\%\+\-]+@[a-z0-9\.\-]+\.[a-z]{2,4}', true)
valid_items, invalid_items = {}, []
## split the list on commas and/or newlines
list_items = list.split(/[,\n]+/)
list_items.each do |item|
if m = r.match(item)
## get the email address
email = m[0]
## get everything before the email address
before_str = item[0, m.begin(0)]
## get everything after the email address
after_str = item[m.end(0), item.length]
## enter the email as a valid_items hash key (eliminating dups)
## make the value of that key anything before the email if it contains
## any alphnumerics, stripping out any angle brackets
## and leading/trailing space
if /\w/ =~ before_str
valid_items[email] = before_str.gsub(/[\<\>\"]+/, '').strip
## if nothing before the email, make the value of that key anything after
##the email, stripping out any angle brackets and leading/trailing space
elsif /\w/ =~ after_str
valid_items[email] = after_str.gsub(/[\<\>\"]+/, '').strip
## if nothing after the email either,
## make the value of that key an empty string
else
valid_items[email] = ''
end
else
invalid_items << item.strip if item.strip.length > 0
end
end
[valid_items, invalid_items]
end
Возвращает хэш с действительными адресами электронной почты в качестве ключей и связанными именами в качестве значений. Любойнедопустимые элементы возвращаются в массиве invalid_items.
См. http://www.regular -expressions.info / email.html для интересного обсуждения регулярных выражений электронной почты.
Я сделалмаленький драгоценный камень из этого в случае, если это могло бы быть полезно кому-то в https://github.com/victorgrey/email_addresses_parser