Необходимо заключить определенные части строки адресов электронной почты в кавычки (версия 2) - PullRequest
0 голосов
/ 12 января 2011

С учетом такой строки:

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

(Обратная косая черта \ означает, что строка продолжается и не являетсяне работает.)

Это связано с Необходимо заключить определенные части строки адресов электронной почты в кавычки , но мне нужно изменить вопрос.

Обратите внимание, чтовсе адреса электронной почты будут заключены в угловые скобки и дополнены полным именем.

Ответы [ 3 ]

1 голос
/ 13 января 2011

Если вы можете гарантировать, что все полученные вами адреса электронной почты отформатированы как «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 голос
/ 13 января 2011

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

0 голосов
/ 12 января 2011

s/(^|\s)([[:alpha:]].*?)(\s*<.*?>\s*(,|$))/$1"$2"$3/g

Казалось бы, связь между "Name" <email>,.Таким образом, чем больше вы знаете об имени (в частности), тем лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...