Validating an email address without using regular expressions

By Steve Claridge on 2015-08-19.

I needed a simple email address validation in JavaScript that caught obvious typos. I didn't really want to use a Regex because I wanted the code to be easy to understand when someone came to read it later, I knew whoever reading would know JavaScript but wasn't sure if they would know regexes that well. So, a simple function to validate an email address:

  function validateEmail( email ) {
    var at = email.indexOf( "@" );
    var dot = email.lastIndexOf( "\." );
    return email.length > 0 &&
           at > 0 &&
           dot > at + 1 &&
           dot < email.length &&
           email[at + 1] !== "." &&
           email.indexOf( " " ) === -1 &&
           email.indexOf( ".." ) === -1;
  }

and some tests:

  function assert( a, b ) {
    return a == b;
  }   console.log( assert( validateEmail( "steve@steve.com" ), true ) );
  console.log( assert( validateEmail( "steve@steve.co.uk" ), true ) );
  console.log( assert( validateEmail( "a@a.uk" ), true ) );
  console.log( assert( validateEmail( "bob.ronald.smith@heroku.co" ), true ) );
  console.log( assert( validateEmail( "bob.ronald.smith@heroku.co.uk.com" ), true ) );
  console.log( assert( validateEmail( "UpperCase@ThisIsUP.com" ), true ) );   console.log( assert( validateEmail( "steve@.com" ), false ) );
  console.log( assert( validateEmail( "steve@aaa.com." ), false ) );
  console.log( assert( validateEmail( "steve@steve" ), false ) );
  console.log( assert( validateEmail( "@steve.com" ), false ) );
  console.log( assert( validateEmail( "steve@" ), false ) );
  console.log( assert( validateEmail( "steve" ), false ) );
  console.log( assert( validateEmail( "steve@steve..com" ), false ) );
  console.log( assert( validateEmail( "steve@.steve.com" ), false ) );
  console.log( assert( validateEmail( "steve@steve..com" ), false ) );