I usually use this one in PHP's eregi (i know it's deprecated):
'^[[:alnum:]][a-z0-9_\.\-]*@[a-z0-9\.\-]+\.[a-z]{2,4}$'
I quickly changed it to work in JS:
/^[a-z][a-z0-9_\.\-]*@[a-z0-9\.\-]+\.[a-z]{2,4}$/i
Quick check:
var r = /^[a-z][a-z0-9_\.\-]*@[a-z0-9\.\-]+\.[a-z]{2,4}$/i;
r.test('someone@somesite.com'); // true
r.test('xyz@xyz.xyz'); // true
r.test('abc@3'); // false
r.test('xyz'); // false
r.test('asdf@asdf.asdfasdfasdf'); // false
One gotchya is that I'm using {2,4}
for the last part, so it matches things like .net
and .com
. But it won't match valid ones like .museum
while it will match non-existant ones like .xx
Now, just for the lulz, I've crated a regexp similar to the one above but instead of the [a-z]{2,4}
I set it up to match every valid domain I am aware of:
/^[a-z][a-z0-9_\.\-]*@[a-z0-9\.\-]+\.(?:aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xxx|ye|yt|za|zm|zw)$/i
giving you:
r.test('someone@somesite.com'); // true
r.test('someone@somefakesite.xb'); // false
r.test('asdf'); // false
r.test('.museum'); // false
r.test('someone@somemuseumsite.museum'); // true
This, of course, makes for a crazy long regexp and (if you want it to hold up over time) will have to be maintained.
Also, in all of these cases, some valid (but very uncommon) addresses will fail. Something like somebody@[192.168.2.1]