(?:[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-4][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-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
Alternately, you can just use this super basic regex which handles all of the common use cases (while still allowing all of the weird edge cases), and functions as a quick "smoke test" for email addresses:
[^@^\s]+@[^@^\s]+
Basically, require at least one character (except a space, a line break, or an @) followed by an @, then at least one character (except a space, a line break, or an @).
The main flaw this simple regex is that it is too permissive and potentially allows weird edge cases like special UTF-8 characters that might not be allowed.
But hey, one might argue that if a user is intentionally entering an invalid email address with wonky characters to create an account, then that's kind of their fault when they never receive the account activation email with the email validation link, right?