The format for e-mail addresses is specified in a number of RFCs; it's a pet peeve of mine when people "validate" away perfectly valid addresses, for instance: websites that think all domains end in .com, .net, .edu, or .org; and agents that refuse to transfer mail with a + in the local-part. To that end, I wrote my own regular expression that (I believe) follows the specification, which I'll share below.

First, I'd like to share some code that Igor found, which he considers a masterpiece.

 

  if(document.forms[0].c_email.value) {
      var add = document.forms[0].c_email.value;
      var ampisthere = false;
      var spacesthere = false;

      var textbeforeamp = false;
      var textafteramp = false;
      var dotafteramp = false;
      var othererror = false;

      for(var i = 0; i < add.length; ++i) {
          if(add.charAt(i) == '@') {
              if(ampisthere)
                  othererror = true;

              ampisthere = true;
          } else if(!ampisthere)
              textbeforeamp = true;

          else if(add.charAt(i) == '.')
              dotafteramp = true;

          else
              textafteramp = true;

          if(add.charAt(i) == ' ' || add.charAt(i) == ',')
              spacesthere = true;

      }

      if(spacesthere || !ampisthere || !textafteramp
      || !textbeforeamp || !dotafteramp || othererror)
      {
          error += "\tEmail addresses must be valid working";
          error += " addresses with no commas or spaces\n";
      }
  }

 

Obviously, it's JavaScript. Unfortunately, there was no equivalent check being done server-side.

And as I promised, here's my own RegExp for you to tear apart. (Yes, I know it doesn't handle a quoted local-part. No, I don't mind. Seriously, who does that?)

^[-!#$%&'*+/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+/0-9=?A-Z^_a-z{|}~])*
@[a-zA-Z](-?[a-zA-Z0-9])*(\.[a-zA-Z](-?[a-zA-Z0-9])*)+$

 

Update: Fixed HTML Encoding problem on RegEx