(?=.{1,64}@) # local-part min 1 max 64
[A-Za-z0-9_-]+ # Start with chars in the bracket [ ], one or more (+)
# dot (.) not in the bracket[], it can't start with a dot (.)
(.[A-Za-z0-9_-]+)* # follow by a dot (.), then chars in the bracket [ ] one or more (+)
# * means this is optional
# this rule for two dots (.)
@ # must contains a @ symbol
[^-] # domain can't start with a hyphen (-)
[A-Za-z0-9-]+ # Start with chars in the bracket [ ], one or more (+)
(.[A-Za-z0-9-]+)* # follow by a dot (.), optional
(.[A-Za-z]{2,}) # the last tld, chars in the bracket [ ], min 2
(?=.{1,64}@) # local-part min 1 max 64
[A-Za-z0-9_-]+ # Start with chars in the bracket [ ], one or more (+)
# dot (.) not in the bracket[], it can't start with a dot (.)
(.[A-Za-z0-9_-]+)* # follow by a dot (.), then chars in the bracket [ ] one or more (+)
# * means this is optional
# this rule for two dots (.)
@ # must contains a @ symbol
[^-] # domain can't start with a hyphen (-)
[A-Za-z0-9-]+ # Start with chars in the bracket [ ], one or more (+)
(.[A-Za-z0-9-]+)* # follow by a dot (.), optional
(.[A-Za-z]{2,}) # the last tld, chars in the bracket [ ], min 2