Разбор писем из адресной книги - PullRequest
4 голосов
/ 01 декабря 2011

В нашем приложении есть страница приглашения, где пользователь может импортировать свою адресную книгу.Мы используем внешний сервис для их получения, поэтому он просто помещает результаты в текстовое поле.Мы начали с простого разделения результатов через запятую и быстро выяснили, что это не сработает из-за:

"Smith, Joe" <jsmith@example.com>, "Jackson, Joe" <jjackson@example.com>

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

Может быть, сработает регулярное выражение?Я очень плохо, кто-нибудь может подсказать мне, что регулярное выражение будет извлекать только письма в массив ...

Примерно так:

emails = recipients.scan(/.*@.*/) <<==== but i know that's not right

РЕДАКТИРОВАТЬ

Похоже, что-то вроде этого может работать.У любого есть какие-либо предложения, если это будет работать для особых случаев:

emails = recipients.scan(/[a-z0-9_.-]+@[a-z0-9-]+\.[a-z.]+/i)

Ответы [ 3 ]

4 голосов
/ 01 декабря 2011
ruby-1.9.3-p0 :055 >   a = '"Smith, Joe" <jsmith@example.com>, "Jackson, Joe" <jjackson@example.com>';
ruby-1.9.3-p0 :056 >   b = a.scan(/<(.*?)>/).flatten
 => ["jsmith@example.com", "jjackson@example.com"] 
ruby-1.9.3-p0 :057 > c = a.scan(/"(.*?)"/).flatten
 => ["Smith, Joe", "Jackson, Joe"] 

Индекс имени / адреса электронной почты в каждом массиве одинаков, поэтому c [1] является именем для письма b [1].

На основании вашего комментария, как насчет его:

ruby-1.9.3-p0 :008 > a = '"Smith, Joe" <jsmith@example.com>, "Jackson, Joe" <jjackson@example.com>';
ruby-1.9.3-p0 :009 >   b = '"test@domain.com, test2@domain.com"';
ruby-1.9.3-p0 :010 >   b.scan(/\w*@\w*\.\w*/)
 => ["test@domain.com", "test2@domain.com"] 
ruby-1.9.3-p0 :011 > a.scan(/\w*@\w*\.\w*/)
 => ["jsmith@example.com", "jjackson@example.com"] 

Это почти то же самое, что вы добавили в свой вопрос, просто более компактно.

3 голосов
/ 17 сентября 2012

Версия Kassym потерпит неудачу при любых обстоятельствах, в том числе на любых адресах электронной почты, которые не содержат слов (например, some.guy@gmail.com)

Парсинг списков адресов электронной почты невозможно выполнить с помощью регулярных выражений. Используйте что-нибудь с реальным парсером, например mail gem:

require "mail"

Mail::AddressList.new(address_list).addresses.map(&:address)

EZ!

0 голосов
/ 01 декабря 2011

Вы можете попробовать разделить с помощью следующего регулярного выражения

,(?=(?:[^"]*"[^"]*")*[^"]*$)

Хотя это не оптимальное быстрое решение и может быть медленным для длинных строк, лучше использовать специализированный парсер. Кавычки могут быть проблемой с этим решением, в зависимости от того, как они экранированы (если вообще).

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