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

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

Учитывая структуру адреса электронной почты, выполните следующие действия:

[email protected]
  • part1 = имя пользователя

  • part2 = домен

  • part3 и part4 = домен верхнего уровня

Это все условия, которые должны быть выполнены:

  • Адрес электронной почты не должен принимать пробелы
  • Адрес электронной почты не должен заканчиваться точкой или символом, отличным от буквы или числа
  • Разрешен только один знак @
  • Не может быть специального символа до или после знака at
  • Не может быть специального символа до или после точки домена (точка после части 2 адреса электронной почты)
  • Вы не можете вводить две или более точки в строке в имени пользователя
  • В домене между точками @и точкой символы, которые находятся рядом с символом @и точкой, должны быть буквой или номером, в середине единственным допустимым символом является дефис.
  • То же самое на шаге 7 идет для домена верхнего уровня (часть 3 и часть 4 или электронная почта).

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

^([\w\.\-]+)@([\w\-]+)((\.(\w){2,9})+)$

Но это не соответствует условиям: 4,5,6,7 и 8

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

ИЗМЕНИТЬ

В адрес электронной почты разрешены только специальные символы: точки, дефисы, символы подчеркивания и знак

Здесь список недействительных сообщений

mkyong - должен содержать символ "@"

mkyong123 @.com - домен не может начинаться с точки "."

mkyong() * @gmail.com - электронные письма разрешают только символ, цифру, подчеркивание и тире

mkyong @% *. com - электронные письма tld допускают только символ и цифру

mkyong..2002 @gmail.com - двойные точки "." не разрешают

mkyong. @gmail.com - последний символ электронной почты не может заканчиваться точкой "."

mkyong @mkyong @gmail.com - двойной "@" не разрешает

[email protected] -emails tld, который имеет два символа, не может содержать цифру

Действительно:

[email protected]

[email protected]

[email protected]

[email protected]

[email protected]

[email protected]

[email protected]

[email protected]

[email protected]

Ответ 1

Это лучшее, что я смог сделать в соответствии с вашим списком действительных и недействительных адресов электронной почты:

^([\w-]|(?<!\.)\.)+[a-zA-Z0-9]@[a-zA-Z0-9]([\w\-]+)((\.([a-zA-Z]){2,9})+)$

DEMO

Обновлено:

^([\w-]|(?<!\.)\.)+[a-zA-Z0-9]@[a-zA-Z0-9]([a-zA-Z0-9\-]+)((\.([a-zA-Z]){2,9}){0‌​,2})$

Ответ 2

Адрес электронной почты не должен принимать пробелы

Нет, "this is"@a-valid-e-mail-address.com.

Разрешен только один знак @

Нет, "[email protected]"@a-valid-e-mail-address.com.

Не может быть специального символа до или после знака

Я не уверен, что это значит, но, вероятно, это не так. !#$%&'*+-/=?^_`{}|[email protected] отлично.

Не может быть специального символа до или после точки домена (точка после части 2 адреса электронной почты)

[email protected]ţḩıš.çóûñţ? Потому что его действительный адрес электронной почты.

Вы не можете ввести две или более точки в строке в имени пользователя

can(...)[email protected]

Не используйте регулярные выражения для проверки адресов электронной почты, пожалуйста.

Ответ 3

Адреса электронной почты имеют определенный формат, который может быть представлен как регулярное выражение. Официальный формат RFC 5322:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]      |  \\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@ (?:(?:a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?  |  \[(?:(?:25[0-5]|2[0-]0-9]|[01]?[0-9][0-9]?)\.){3}       (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-]:          ?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

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

Поскольку вы настраиваете регулярное выражение электронной почты по-своему, это не делает все правильно. Он может ответить на ваши требования, чтобы использовать этот формат, но адрес электронной почты является фиксированным форматом, поэтому просто используйте ссылочный или упрощенный, например, те, что указаны на Regular-Expressions. В противном случае этот вопрос никогда не получит ответа на ваши точные требования.