0

Good Evening, I am working on creating a regular expression to validate email addresses in Javascript. I have the function working, however I know this expression could be written better. How could I improve it?

function checkEmailAddress(inputEmailAddy){
    var regex = new RegExp(\"^([A-Z][a-z][0-9][_][-][.])+\@([A-Z][a-z][0-9][_][-][.])+\.([A-Za-z]{2,4})$/\");

    return (regex.test(inputEmailAddy) == 1 ? 1 : -1);
}

Thanks, Mike

6

3 Answers 3

2

The local-part of the email, to the left of the @ sign, can contain absolutely anything if quoted properly, and you simply cannot interpret quoting with a regular expression - you must parse the email address according to RFC rules, or you will reject some valid email addresses.

Even with a regex that is "good enough" you still have to send a confirmation email to verify that it's a legitimate address.

(most of the answers suggested here on SO to the many times this question has been asked will fail, and reject my email address, because I have a plus + my address)

Sign up to request clarification or add additional context in comments.

Comments

0

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('[email protected]'); // true
r.test('[email protected]'); // true
r.test('abc@3'); // false
r.test('xyz'); // false
r.test('[email protected]'); // 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('[email protected]'); // true
r.test('[email protected]'); // false
r.test('asdf'); // false
r.test('.museum'); // false
r.test('[email protected]'); // 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]

4 Comments

It would also reject my email address, which has a + in it. See the monstrosity mentioned in the answer referenced by Clive's comment to the question.
Thanks! Yeah, that looks way crazier yet better.
Considering that now everyone with enough money can buy new top domain level, hard-coding top-domain level in a regex is a quite bad idea. You're almost guaranteed that it will be wrong in the future.
thats why is said 'for the lulz' - just showing how overboard a regexp for email can be.
0

Here an example code

<input type="text" id="email">
function test(){
var emailElement = document.getElementById('#email');
var emailPattern = /^[a-zA-Z]([a-zA-Z0-9_\-])+([\.][a-zA-Z0-9_]+)*\@((([a-zA-Z0-9\-])+\.){1,2})([a-zA-Z0-9]{2,40})$/;

if(!emailPattern(emailElement.value)){
    return false;
   } else {
    return true;
  }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.