[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 422
  • Last Modified:

ASP: need regexp for various email formats

I need a regexp that allows emails as follows: name.tac@fr.mac.moneys
In addition to regular emails  like test@aol.com  

I found the following regexp, but it doesn't satisfy emails where more than 1 period.
Can you please explain what this current regexp is doing?

if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(args.Value))

And advise of a regexp that would accept various email types.
0
badtz7229
Asked:
badtz7229
1 Solution
 
Big MontySenior Web Developer / CEO of ExchangeTree.org Commented:
try this:

if( "^[a-z0-9_\+-]+(\.[a-z0-9_\+-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,4})$" )

taken from here:

http://www.markussipila.info/pub/emailvalidator.php?action=validate
0
 
käµfm³d 👽Commented:
Why not go by what is mentioned here:  http://www.regular-expressions.info/email.html

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

Open in new window


It's a bit generic, but I tend to agree with the author's logic regarding complex email validation. Besides, a regex can't tell you if the email address actually exists--only the receiving server can do that.
0
 
Scott Fell, EE MVEDeveloperCommented:
RegEx always takes me some time.   For validating emails I have just been checking for the @ and length greater than 3 with something on both sides of the @.   There are a lot of new gtld's coming on line this year to watch for.

http://www.regular-expressions.info/email.html

New gtld's http://www.newtldlist.com/
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
badtz7229Author Commented:
@Big Monty: this example wouldn't work on name.tac@fr.mac.moneys  but it did work for name.tac@fr.mac.mone

@kaufmed:      your solution unfortunately, did not work. not even for simple emails like test@aol.com  (weird)
0
 
käµfm³d 👽Commented:
Turn on case-insensitivity:

/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i

Open in new window


Note the trailing "i" on the above expression.

e.g.

http://jsfiddle.net/d89gZ/
0
 
badtz7229Author Commented:
@kaufmed- that still didn't work. not even simple email addresses are accepted.
0
 
käµfm³d 👽Commented:
Did you check my sample code on JSFiddle? Every example you've given thus far validates in the sample. Updated to add additional prompts:

http://jsfiddle.net/d89gZ/1/
0
 
käµfm³d 👽Commented:
One last update:

http://jsfiddle.net/d89gZ/2/

You'll probably want to change the TLD check to be unbounded since you have "moneys" as one TLD. I've also switched the anchors from word boundaries ( \b ) to start of line ( ^ ) and end of line ( $ ), since it seems as though the entire string you are testing is in the email address (and it is not a substring of a larger string).

if (/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(args.Value)) {

Open in new window

0
 
badtz7229Author Commented:
yes this worked for the types of emails i'm dealing with. thanks.

can you please explain what this regexp does and during what conditions it would fail?
i'm new to this.
0
 
käµfm³d 👽Commented:
^               - Matches start of string
[A-Z0-9._%+-]+  - Matches one or more ( + ) of any ( [...] ) letter ( A-Z ), number ( 0-9 ), period/full stop, underscore, percent, plus, or hypen ( ._%+- )
@               - Matches literal @
[A-Z0-9.-]+     - Matches one or more ( + ) of any ( [...] ) letter ( A-Z ), number ( 0-9 ), period/full stop ( . ), or hyphen ( - )
\.              - Matches literal period/full stop
[A-Z]{2,}       - Matches at least two ( {2,} ) of any ( [...] ) letter ( A-Z )
$               - Matches end of string
i               - Turns on case-insensitivity

Open in new window


The net effect is that you find one or more "words" each separated by a period/full stop (if present), then an @ symbol, then one or more "words" each separated by a period/full stop (if present), then the last period/full stop, then the TLD. The TLD must be at least two characters (e.g. .co, .us, .jp, etc.).

As far as when it "fails," I take it you mean what inputs will it reject? Anything with two @ symbols will be rejected. If the part trailing the @ does not have at least one dot, then that will be rejected. Anything with special characters other than period/full stop, underscore, percent, plus, or hyphen (e.g. $, ^, &, etc. ) will be rejected. (To be fair, & is actually a valid character in email addresses, as are many others. It is in less common usage, though.) If the TLD contains numbers, then it will be rejected.
0
 
badtz7229Author Commented:
Thank u for explanation
0
 
badtz7229Author Commented:
could i have also used
 if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$/.test(args.Value)) {

seems to be this works just as well?
0
 
käµfm³d 👽Commented:
\w is shorthand for [a-zA-Z0-9_]. The equivalent to the pattern I suggested would be:

if (/^[\w.%+-]+@[\w.-]+\.[A-Z]{2,}$/i.test(args.Value)) {

Open in new window

0
 
badtz7229Author Commented:
thanks
0
 
badtz7229Author Commented:
@ kaufmed:
the only problem i find with
if (/^[\w.%+-]+@[\w.-]+\.[A-Z]{2,}$/i.test(args.Value)) {

is that this allows for multiple ".", so test...atol@aol.com is ok

whereas
 if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$/.test(args.Value)) {
will catch that bc of  [\.-]?
0
 
käµfm³d 👽Commented:
For that reason, yes I agree. I was focused on the usage of \w, not the semantics of the overall pattern.
0
 
badtz7229Author Commented:
Thanks again.
0

Featured Post

The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now