Проверка подлинности 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-Za-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
Может ли кто-нибудь помочь мне переписать мое регулярное выражение?
Ответы
Ответ 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
Ответ 9
попробуй это !!!
/\[A-Z0-9._%+-\][email protected]\[A-Z0-9.-\]+\.\[AZ\]{2,4}/i
выбрана только строка письма
"Robert Donhan" <[email protected]>sadfadf
Robert Donhan <[email protected]>
"Robert Donhan" [email protected]
Robert Donhan [email protected]