my $emailPattern = qr{ ^ #begin of line
([a-z0-9_.-]+) #one or more letters, numbers, _ . or -
@ #followed by an @ sign
([\da-z.-]+) #then one or more letters, numbers, _ . or -
\. #followed by a period
([a-z.]{2,6}) #followed by 2 to 6 letters or periods
$ }xi; #end of line and ignore case
if( '[email protected]' =~ $emailPattern ){
print "E-mail is valid\n";
} else {
print "E-mail is invalid\n";
}
EDIT: A much better way of doing it though:
use Mail::Sendmail;
if( '[email protected]' =~ /$Mail::Sendmail::address_rx/ ){
print "E-mail is valid\n";
} else {
print "E-mail is invalid\n";
}
True, but then you have the overhead of string concatenation... although in the large scheme of things that is probably very small, unless you are doing it in a huge loop, but then you'd cache that RegExp anyway.
For a little dollop of recursivity in your morning coffee, here's the bit where the CoffeeScript compiler uses these extended regular expressions to lex, among other things, extended regular expressions...
I know the email validation was just an example, but since we're on the subject, if you've got an email validation that includes a maximum number of characters for the TLD you might want to update that before the new TLDs start rolling in later this year or next.
Perl, Ruby and some other languages support a similar 'extended' RegEx syntax which allows comments and disregards whitespace (in Ruby, you use the 'x' flag on a Regexp literal).
For those using plain JavaScript -- or wanting to do a one-off conversion -- I wrote a simple JS function that converts an extended RegEx to a plain one:
Yeah, my guess is that CoffeeScript took direction from those languages for this feature.
Nice function to convert annotated string to a regex. I wonder if this is being considered in the next versions of JavaScript? Or better yet... native annotation?
I like the CoffeeScript approach since that logic is done at compile time and not when it is being executed.
"Let's face it, regular expressions aren't for everyone."
Wait, since when aren't they? I would have thought basic regex skills were a baseline shibboleth of a programmer. I even know several non-technical people that are proficient.
Your comment reminded me of Jamie Zawinski's tongue-in-cheek quotation "Some people, when confronted with a problem, think
'I know, I'll use regular expressions.' Now they have two problems." (http://regex.info/blog/2006-09-15/247)
Jestful, off-the-wall comments aside, I love regex. It takes away a great deal of the drudgery associated with processing volumes and volumes of text. I can't imagine not having it.
(Aside: Now that you mention it, I can think of a couple people who aren't programmers who use regex pretty frequently because it makes their life a little easier even if it isn't highly advanced, super-dense regex.)
That has nothing to do CoffeeScript, most regex parser implementation support this via a flag. I've seen it done in PHP, Ruby, Perl, Objective-C. For languages whose regular expression engine don't support this, it's easy enough to achieve it via string concatenation.
I personally don't find this example very helpful in showing why I would do this. The regex is simple enough and to me the comments are the equivalent of "return here", needless and distracting.
The example was to show how you could do it, not necessarily that it was needed for that case. However, you might be surprised how many developers aren't familiar with that example regex.
I'm pretty sure that these expressions are simplified to normal JavaScript expressions at compile time, so there is no performance penalty.
Even if they were compiled at runtime, the performance penalty would probably be negligible unless you were randomly compiling the expression in the middle of an inner loop or something equally silly.
[+] [-] mike-cardwell|14 years ago|reply
[+] [-] draegtun|14 years ago|reply
[+] [-] elijahmanor|14 years ago|reply
[+] [-] phuff|14 years ago|reply
[+] [-] elijahmanor|14 years ago|reply
[+] [-] jashkenas|14 years ago|reply
https://github.com/jashkenas/coffee-script/blob/master/src/l...
[+] [-] joshuahedlund|14 years ago|reply
[+] [-] peter_l_downs|14 years ago|reply
http://docs.python.org/library/re.html#re.VERBOSE
[+] [-] elijahmanor|14 years ago|reply
[+] [-] gmac|14 years ago|reply
For those using plain JavaScript -- or wanting to do a one-off conversion -- I wrote a simple JS function that converts an extended RegEx to a plain one:
http://blog.mackerron.com/2010/08/08/extended-multi-line-js-...
[+] [-] elijahmanor|14 years ago|reply
Nice function to convert annotated string to a regex. I wonder if this is being considered in the next versions of JavaScript? Or better yet... native annotation?
I like the CoffeeScript approach since that logic is done at compile time and not when it is being executed.
[+] [-] samarudge|14 years ago|reply
"()<>[]:;@,\\\"!#$%&'*+-/=?^_`{}| ~ ? ^_`{}|~."@example.org
is a perfectly valid email address [1]
[1] http://en.wikipedia.org/wiki/Email_address#Valid_email_addre...
[+] [-] ColMustard|14 years ago|reply
AFAIK there are regular expressions that cover all valid email addresses (and some invalid, but better than not recognizing one that is valid).
Although it gets pretty nasty: http://www.diablotin.com/librairie/autres/mre/chBB.html
[+] [-] cynoclast|14 years ago|reply
[+] [-] jriddycuz|14 years ago|reply
Wait, since when aren't they? I would have thought basic regex skills were a baseline shibboleth of a programmer. I even know several non-technical people that are proficient.
[+] [-] Zancarius|14 years ago|reply
Jestful, off-the-wall comments aside, I love regex. It takes away a great deal of the drudgery associated with processing volumes and volumes of text. I can't imagine not having it.
(Aside: Now that you mention it, I can think of a couple people who aren't programmers who use regex pretty frequently because it makes their life a little easier even if it isn't highly advanced, super-dense regex.)
[+] [-] SeoxyS|14 years ago|reply
[+] [-] RyanMcGreal|14 years ago|reply
[+] [-] shtylman|14 years ago|reply
[+] [-] elijahmanor|14 years ago|reply
[+] [-] buddydvd|14 years ago|reply
[+] [-] mrpollo|14 years ago|reply
[+] [-] tikhonj|14 years ago|reply
Even if they were compiled at runtime, the performance penalty would probably be negligible unless you were randomly compiling the expression in the middle of an inner loop or something equally silly.