 <pre class="lang-js prettyprint-override"><code>^[a-zA-Z0-9]+(?:\.?[\w!#$%&amp;'*+/=?^`{|}~\-]+)*@[a-zA-Z0-9](?:\.?[\w\-]+)+\.[A-Za-z0-9]+$ </code></pre> <p>No <code>..</code> and at least 1 <code>.</code> and 1 <code>@</code>.<br> Also starts/ends with letters/numbers.</p> <p>The <code>^</code> (start) and <code>$</code> (end) were just added to match a whole string, not just a substring. But you could replace those by a word boundary <code>\b</code>.</p> <p>An alternative where the special characters aren't hardcoded:</p> <pre><code>^(?!.*[.]{2})[a-zA-Z0-9][^@\s]*?@[a-zA-Z0-9][^@\s]*?\.[A-Za-z0-9]+$ </code></pre>