Подтвердить что ты не робот

Проверка подлинности Ruby Email с регулярным выражением

У меня большой список писем, по которым я работаю. Многие письма содержат опечатки. Я пытаюсь создать строку, которая будет проверять действительные электронные письма.

это то, что у меня есть для регулярных выражений.

def is_a_valid_email?(email)
  (email =~ /^(([A-Za-z0-9]*\.+*_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\+)|([A-Za-z0-9]+\+))*[A-Z‌​a-z0-9][email protected]{1}((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,4}$/i)
end

Это проходит, если письмо подчеркивает, и только один период. У меня много писем, в названии которых больше одного периода. Как мне проверить это в регулярном выражении.

[email protected] # <~~ valid
foo.bar#gmail.co.uk # <~~~ not valid
[email protected] # <~~~valid 
[email protected] # <~~ not valid 
[email protected]  #<~~ valid

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

4b9b3361

Ответ 1

TL; DR:

кредит идет к @joshuahunter (ниже, upvote его ответ). Включено здесь, чтобы люди видели это.

URI::MailTo::EMAIL_REGEXP

Старый TL; DR

VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

Оригинальный ответ

Вы, кажется, все усложняете, я бы просто использовал:

VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i

который взят из книги Майкла Хартла Рельса

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

VALID_EMAIL_REGEX = /\A([\w+\-]\.?)[email protected][a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i

Как упоминал CAustin, есть много других решений.

EDIT:

@installero указало, что оригинал не работает для поддоменов с дефисами в них, эта версия будет работать (не знаю, почему в классе символов в первую очередь отсутствовали цифры и дефисы).

VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

Ответ 2

Это было встроено в стандартную библиотеку начиная с версии 2.2.1

URI::MailTo::EMAIL_REGEXP

Ответ 3

Вот отличная статья David Celis, объясняющая, почему каждое регулярное выражение, которое вы можете найти для проверки адресов электронной почты, неверно, включая те, которые были выше Майком.

Из статьи:

Локальная строка (часть адреса электронной почты, которая предшествует @) может содержать следующие символы:

    `! $ & * - = ` ^ | ~ # % ' + / ? _ { }` 

Но угадайте, что? Вы можете использовать почти любой персонаж, которого вы хотите, если вы избежите его, окружив его в кавычках. Например, "Посмотрите на все эти пространства!" @Example.com - это Действующий электронный адрес. Ницца.

Если вам нужно выполнить базовую проверку, лучшим регулярным выражением является просто /@/.

Ответ 4

Это более короткое и безопасное:

/\A[^@\s][email protected][^@\s]+\z/

Регулярный используется в драгоценности Gem. Но у него есть некоторые уязвимости для этих значений:

  "[email protected]",
  "[email protected]+THING-ODD!!.com",
  "[email protected],com",
  "[email protected],co.de"

Я предпочитаю использовать regexp из библиотеки ruby ​​URI::MailTo::EMAIL_REGEXP

Существует жемчужина для проверки электронной почты

Email Validator

Ответ 5

В настоящее время Ruby предоставляет регулярное выражение проверки электронной почты в своей стандартной библиотеке. Вы можете найти его в модуле URI::MailTo, это URI::MailTo::EMAIL_REGEXP. В Ruby 2.4.1 он оценивается как

/\A[a-zA-Z0-9.!\#$%&'*+\/=?^_'{|}~-][email protected][a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z/

Но я бы просто использовал саму константу.

Ответ 6

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

VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

Например:

> '[email protected]' =~ VALID_EMAIL_REGEX
=> 0

Ответ 7

Ваш действительно сложный.

VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i

Приведенного выше кода должно быть достаточно.

Объяснение каждого фрагмента вышеприведенного выражения для пояснения:

Начало регулярного выражения:

/

Соответствует началу строки:

\A

Как минимум один символ слова, плюс, дефис или точка:

[\w+\-.]+

Буква "в знак":

@

Буквальная точка:

\.

Как минимум одно письмо:

[a-z]+

Соответствует концу строки:

\z

Конец регулярного выражения:

/

Без учета регистра:

i

Снова собираем его вместе:

/\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i

Проверьте Rubular, чтобы удобно проверять выражения по мере их написания.

Ответ 8

Это хорошо для меня:

if email.match?('[a-z0-9]+[_a-z0-9\.-]*[a-z0-9][email protected][a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})')
      puts 'matches!'
else
      puts 'it doesn\'t match!'
end