top | item 3566491

Regular Expressions in CoffeeScript are Awesome

45 points| elijahmanor | 14 years ago |elijahmanor.com | reply

27 comments

order
[+] mike-cardwell|14 years ago|reply
His example, slightly modified for Perl:

  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";
  }
[+] phuff|14 years ago|reply
In JS you can comment regular expressions, too... :)

  var foo = new RegExp(
                    '\\d\+' + // First digit
                    '-' +     // Delimiter
                    '\\d\+'   // Second digit
                    );
  foo.test("1234-5432");
[+] elijahmanor|14 years ago|reply
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.
[+] joshuahedlund|14 years ago|reply
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.
[+] gmac|14 years ago|reply
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:

http://blog.mackerron.com/2010/08/08/extended-multi-line-js-...

[+] elijahmanor|14 years ago|reply
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.

[+] samarudge|14 years ago|reply
You shouldn't validate emails by regular expressions since, technically (at least according to spec)

"()<>[]:;@,\\\"!#$%&'*+-/=?^_`{}| ~ ? ^_`{}|~."@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
More like you shouldn't validate emails by using crappy regular expressions?

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
You shouldn't try to validate an email address by any means other than sending mail to it. If it works, it's valid.
[+] jriddycuz|14 years ago|reply
"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.

[+] Zancarius|14 years ago|reply
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.)

[+] SeoxyS|14 years ago|reply
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.
[+] shtylman|14 years ago|reply
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.
[+] elijahmanor|14 years ago|reply
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.
[+] buddydvd|14 years ago|reply
What about trailing spaces? They need to be escaped by parenthesis?
[+] mrpollo|14 years ago|reply
is there any performance penalty?
[+] tikhonj|14 years ago|reply
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.