рельсы - REGEX для проверки электронной почты - PullRequest
17 голосов
/ 22 января 2011

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

def is_a_valid_email?(email)
    email_regex = %r{
      ^ # Start of string
      [0-9a-z] # First character
      [0-9a-z.+]+ # Middle characters
      [0-9a-z] # Last character
      @ # Separating @ character
      [0-9a-z] # Domain name begin
      [0-9a-z.-]+ # Domain name middle
      [0-9a-z] # Domain name end
      $ # End of string
    }xi # Case insensitive

    (email =~ email_regex)
end

Проблема с приведенным выше: XXX_XXX@Xxx.com не возвращается как действительныйкогда это должно быть.Любые мысли или предложения для лучшего регулярного выражения?

Спасибо

Ответы [ 13 ]

24 голосов
/ 22 января 2011
validates_format_of :email, 
  :with => /^(|(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6})$/i

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

12 голосов
/ 01 июля 2013

@ jensgram действительно хороший ответ, но на самом деле он по-прежнему позволяет использовать электронную почту без домена, например, foo @ bar действителен как foo@bar.com.

Вот небольшое изменение, которое требует string@string.string:

/\A\S+@.+\.\S+\z/

или, более читабельно (хотя скобки не нужны):

/\A(\S+)@(.+)\.(\S+)\z/

Поиграйте с этим

* Примечание: это регулярное выражение лучше, чем многие, более сложные, из-за того, насколько разнообразным может быть электронное письмо. Технически, электронная почта может даже использовать пробелы, если она заключена в кавычки, например "Это действительный адрес электронной почты" @ email.com

* Редактировать: я заменил ^ и $ на \A и \z, чтобы предотвратить ошибку многострочной привязки при тестировании рельсов.

* Редактировать: Спасибо @Barry за то, что он заметил, что регулярное выражение допускает пробелы. Обновил регулярное выражение с \ S, чтобы не допускать электронных писем с неправильными пробелами. Разрешается использовать несколько точек, так как email@foo.bar.com является приемлемым адресом.

11 голосов
/ 22 января 2011

Мой снимок (см. Комментарий и ссылку выше):

^.+@.+$
10 голосов
/ 07 сентября 2017

Недостаточно репутации, чтобы добавить комментарий, но если вы собираетесь использовать регулярное выражение Devise, и вы уже используете сам Devise, то вы можете просто использовать:

validates :email, presence: true, format: Devise.email_regexp

8 голосов
/ 22 января 2011
/\b[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}\z/

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

Источник: http://www.regular -expressions.info / email.html

5 голосов
/ 25 февраля 2014

Большинство этих ответов слишком ограничены или допускают адреса, которые явно неверны.Поэтому лучше отказаться от чрезмерной строгости, которая расстроит пользователей и просто сделает все правильно.

1.Наиболее распространенный вариант использования:

    validates :email, ..., format: { with: /\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z/ }

2.Чтобы также разрешить root@localhost или homer@blinky, используйте это:

    validates :email, ..., format: { with: /\A[^@\s]+@([^@.\s]+\.)*[^@.\s]+\z/ }

Ничто из вышеперечисленного не заменяет поиск CAPTCHA, записей DNS, черных списков домена DNS, черных списков IP-адресов и электронных писем с подтверждением.

Для реальной проверки домена электронной почты это можно использовать вместо: https://gist.github.com/9200104

Эта лошадь полностью избита и превращается в киббл.

1 голос
/ 22 июня 2016

^.+@[\w]+\S[^\s]+$

Краткое улучшение к первому ответу

1 голос
/ 25 сентября 2013

использование: /\A[^@\s]+@[^@\s]+\z/

В нем утверждается, что в локальной части или домене нет символов @ или пробелов и что существует один символ @, разделяющий локальную часть и домен.

Что более важно: требуется подтверждение по электронной почте

По мере того, как создается больше tlds, это прогрессивное мышление.

Это от Разработка , отраслевой стандарт для аутентификации.

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

Вот регулярное выражение электронной почты, которое я использовал некоторое время:

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

Это от здесь

0 голосов
/ 11 июня 2014

В неанглийских локалях вам может потребоваться подтверждение писем с акцентированными (Unicode) символами, такими как čšēīū и т. Д.

Этот метод проверяет возвращаемое nil как признак неудачной проверки электронной почты в следующих локалях:

def validate_unicode_email email
  /\A[\w\u00C0-\u017F\-]+(\.[\w\u00C0-\u017F\-]+)?@[\w\u00C0-\u017F\-]+\.[\w]{2,6}$/.match email
end

Это будет передавать электронные письма, такие как name.surname@gmail.com, āpsis@mājās.lv, test_email@test_domain.org

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