Что случилось с этим RegEx для проверки электронных писем?

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

7
задан ROMANIA_engineer 11 November 2016 в 19:05
поделиться

5 ответов

«Как проверить электронную почту с помощью регулярного выражения» - один из наиболее популярных вопросов, которые возникают, когда дело доходит до регулярных выражений, и единственный настоящий хороший ответ - «нет». Это обсуждалось на этом же сайте в много раз . Вы должны понимать, что если вы действительно хотите следовать спецификации, ваше регулярное выражение будет выглядеть примерно так this . Очевидно, что это чудовище и скорее упражнение, демонстрирующее, насколько до смешного сложно придерживаться того, что вы должны быть в состоянии принять. Имея это в виду, если вам абсолютно необходимо знать, что адрес электронной почты действителен, единственный реальный способ проверить это - это отправить сообщение на адрес электронной почты и проверить, отскакивает ли оно или нет. В противном случае, это регулярное выражение будет правильно проверять большинство случаев, и во многих ситуациях в большинстве случаев бывает достаточно. Кроме того, на этой странице обсуждаются проблемы с попыткой проверки электронной почты с помощью регулярного выражения.

18
ответ дан 6 December 2019 в 06:25
поделиться

Я отвечу только на ваш первый вопрос и с точки зрения технического регулярного выражения .

Что не так с регулярным выражением \ S + @ \ S + \. \ S + заключается в том, что он может выполняться слишком медленно. Что произойдет, если кто-то введет строку электронной почты, подобную приведенной ниже, и вам нужно ее подтвердить?

a@b.cdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789

Или даже хуже (да, это 100 @ после точки):

@ . @@@@@@@@@@@@@@@@@@@@@@@@@ \ @@@@@@@@@@@@@@@@@@@@@@@@ \ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@

Медлительность бывает. Сначала регулярное выражение будет жадно соответствовать как можно большему количеству символов для первого \ S + . Итак, изначально он будет соответствовать всей строке. Затем нам нужен символ @, поэтому он будет возвращаться, пока не найдет его. В этот момент у нас есть еще один \ S + , так что он снова потребляет все до конца строки. Затем ему нужно вернуться назад, пока не найдет точку. Можете ли вы представить себе, сколько обратного отслеживания происходит до того, как регулярное выражение окончательно завершится с ошибкой во второй строке электронного письма?

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

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

Я провел быстрый тест для двух регулярных выражений против «100 Электронная почта @ ». Мой примерно в 95 раз быстрее.

7
ответ дан 6 December 2019 в 06:25
поделиться

Что не так с приведенным выше RegEx?

Он проверяет только "@" и. Есть много вещей, которые определенно не являются законными адресами электронной почты, которые могут соответствовать этой комбинации.

Например, если человек написал user@www.myWebsite.com, он будет соответствовать, но это, очевидно, ошибка. Немного более изощренное в регулярном выражении могло бы уловить это и помочь пользователю.

То же самое, если он ввел user@myWebsite.nt - он неправильно написал «net». Или он вставил две @@ ( user @ @ yahoo.com / user @ yahoo @ yahoo.com - что на самом деле довольно часто) или две точки ( user @ yahoo..com ). Лучшее регулярное выражение должно их уловить.

[Хотя более эффективные проверки часто останавливаются из-за других ошибок, таких допустимых множественных точек до и после 'at', которые могут быть опущены или признаны недействительными ( my.name@gmail.com )]

Если вы не хотите чтобы быть разборчивым, вам даже не нужно регулярное выражение. indexOf ('@')! = -1 перехватит большинство ошибок. После проверки у вас должно получиться лучше.

Что такое регулярное выражение для проверки электронной почты?

http://www.gooli.org/blog/useful-regular-expressions

http: //www.regular- expression.info/email.html

2
ответ дан 6 December 2019 в 06:25
поделиться

Что не так с указанным выше RegEx?
Стандарт RFC822 для адресов электронной почты очень свободный, поэтому трудно найти краткое регулярное выражение, которое захватило бы все возможные допустимые электронные письма. Дело усложняется тем фактом, что не каждый почтовый сервер / клиент применяет этот стандарт, поэтому фактические данные могут быть

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

Какое регулярное выражение подходит для проверки электронных писем?
Это эталонное регулярное выражение для проверки на соответствие RFC, здесь оно реализовано как модуль Perl, но есть также окончательный список в O'Reillys "Mastering Regular Expressions"

Mail :: RFC822 :: Адрес

-1
ответ дан 6 December 2019 в 06:25
поделиться

Я вижу, что @liam опубликовал ссылку на RFC822 . Но в соответствии с идеей, что stackoverflow - это пункт назначения, и если ex-parrot.com удалит ссылку или что у вас есть. В целом ...

Mail :: RFC822 :: Address: проверка адреса на основе регулярного выражения

Mail :: RFC822 :: Address - это модуль Perl для проверки адресов электронной почты в соответствии с грамматикой RFC 822 . Он обеспечивает ту же функциональность, что и RFC :: RFC822 :: Address, но использует регулярные выражения Perl, а не синтаксический анализатор Parse :: RecDescent. Это означает, что модуль загружается намного быстрее, так как ему не нужно компилировать грамматику при запуске.

Загрузить Mail :: RFC822 :: Address-0.4.tar.gz или читать документация .

Грамматика, описанная в RFC 822, на удивление сложна.

2
ответ дан 6 December 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: