This should work:
^[^@\r\n\s]+[^.@]@[^.@][^@\r\n\s]+\.(\w){2,}$
I tested it against these invalid emails:
@exampleexample@domaincom.com
example@domaincom
exampledomain.com
exampledomain@.com
exampledomain.@com
example.domain@.@com
e.x+a.1m.5e@em.a.i.l.c.o
some-user@internal-email.company.c
some-user@internal-ema@il.company.co
some-user@@internal-email.company.co
@test.com
test@asdaf
test@.com
test.@com.co
And these are valid letters:
example@domain.com
e.x+a.1m.5e@em.a.i.l.c.om
some-user@internal-email.company.co
change
This seems to confirm all the addresses from this wikipedia page, although it probably also allows the use of some invalid emails. The brackets will be broken into everything before and after @:
^([^\r\n]+)@([^\r\n]+\.?\w{2,})$
niceandsimple@example.com
very.common@example.com
a.little.lengthy.but.fine@dept.example.com
disposable.style.email.with+symbol@example.com
other.email-with-dash@example.com
user@[IPv6:2001:db8:1ff::a0b:dbd0]
"much.more unusual"@example.com
"very.unusual.@.unusual.com"@example.com
"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com
postbox@com
admin@mailserver1
!
"()<>[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a"@example.org
" "@example.org
üñîçøðé@example.com
üñîçøðé@üñîçøðé.com
source
share