I'm more familiar with Perl compatible regex, but here's my take (which may be wrong, since I'm assuming from a PCRE background):
^
assert start of subject, i.e. match the pattern fully from the start of the subject
[@ ]+
The [] indicates a character class. ^ negates the character class. As such, [@] means to match characters other than '@'. The + means to match the preceding expression one or more times. So this expression means to match characters other than '@' one or more times.
@
This is straightforward, a literal '@' character.
([a-zA-Z0-9-]+.)+
Let's break this up further:
[a-zA-Z0-9-] is a character class consisting of case-insenstive alphanumeric characters and the dash '-', which is escaped and so is written as '-'. This character class is matches one or more times, since it is followed by a +.
. is a literal period '.'.
([a-zA-Z0-9-]{2}|net|com|gov|mil|org|edu|int)
Here {2} works like +, but matches exactly two times. The | means logical or.
\$
assert end of subject, i.e. match the pattern fully until the end of the subject
You could read the PHP Manual on regular expressions:
Regular Expression Functions (Perl-Compatible)
Regular Expression Functions (POSIX Extended)