Невозможно создать правильную проверку электронной почты только с помощью регулярных выражений.
Вот описание того, как (почти) правильно проверить адреса электронной почты.
Письма проверяются в соответствии с RFC 5321 и RFC 5322 . Ниже приведено упрощенное формальное определение синтаксиса электронной почты:
addr-spec = local-part "@" domain
local-part = dot-atom-text / quoted-string
dot-atom-text = atom *("." atom)
atom = 1*atext
atext = ALPHA / DIGIT / "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~"
ALPHA = ASCII characters in the range ‘a’ (ACSII code 0x61) through ‘z’ (ACSII code 0x7A) and ‘A’ (ACSII code 0x41) through ‘Z’ (ACSII code 0x5A)
DIGIT = ASCII characters in the range ‘0’ (ACSII code 0x30) through ‘9’ (ACSII code 0x39)
specials = "(" / ")" / "<" / ">" / "[" / "]" / ":" / ";" / "@" / "\" / "," / "."
quoted-string = “ *(qcontent) “
qcontent = qtext / quoted-pair
qtext = 0x21 / 0x23-0x5B / 0x5D-0x7E; All ASCII printable characters instead of “ and \
quoted-pair = \ (VCHAR / WSP)
VCHAR = 0x21-0x7E; All ASCII printable characters
WSP = 0x20 / 0x09; ASCII Space or tab characters
В дополнение к этим правилам указанная пара может быть размещена в любом месте внутри local-part .
Обратите внимание, что специальная группа символов не используется. Эти символы не могут присутствовать ни в локальной части , ни в доменной части сообщения электронной почты.
local-part может быть длиной до 64 символов, а domain domain может быть длиной до 255 символов (если это должно быть допустимое имя домена DNS), если объединено длина всего письма не более 256 символов.
Доменные имена проверяются в соответствии с RFC 1034 и RFC 1123 . Ниже приведено формальное определение синтаксиса доменного имени:
domain = subdomain / " "
subdomain = label / subdomain "." label
label = let-dig *(*(ldh-str) let-dig)
ldh-str = let-dig-hyp / let-dig-hyp ldh-str
let-dig-hyp = let-dig / "-"
let-dig = ALPHA / DIGIT
Дополнительно RFC 1034 ограничивает домен до 255 символов ASCII и метку до 63 символов ASCII.
Хорошим началом является проверка правильности использования Apache (упомянутая в комментариях к вопросу). Он содержит как проверку домена, так и проверку электронной почты, хотя в прошлую проверку я обнаружил несколько ошибок в проверке электронной почты.