The Perl Regular Expression Challenge

Written by Mark Sanborn: Sep 11, 2008

With my newly acquired Perl and regular expression skills I was trying to put them to the test and get a little practice. I asked a friend of mine if he had any regular expressions I should write. He first gave me an easy one. Replace ‘foo’ with ‘bar’ only when bar follows the word ‘blah’. So after a minute or two I returned with a working regular expression.

Well that was easy…

Now for something a little trickier. He said, I want a regular expression that would print out words that land on every third letter ‘e’ except if that word was ‘the’. This doesn’t mean he wanted the third word that has the letter ‘e’.

To further clarify

Meet the Press!’ Would match only ‘Press!’ since the is excluded. ‘Meet them guys there’ Would match the word ‘them’. Although it them is the second word it is the third time ‘e’ is used in the string. ‘eeeeee’ would match the word ‘eeeeee’ twice, although we would probably not find that word too often. ‘Them them thee rem em shem’ Would match em. Notice how the second ‘e’ counts towards the next match.

It took me awhile to figure out the solution to this problem because I was trying to solve the problem with pure regular expressions. Which I am told is not possible.

I ended up solving the problem with a little bit of Perl code with the help of two simple regular expressions. If you are looking for a challenge or hone in your skills this is a great problem to practice with. If you are learning a new language this problem incorporates many of the needed elements in programming and will help you learn the language.

How I did it

#!/usr/bin/perl

use warnings;

$_ = "my test string goes here";
while (/(\w+)/gi) {
    $word = $&;
    while ($word =~ /e/gi) {
        $count++;
        if ($count == 3 and $word ne 'the') {
            print "$word\n";
            $count = 0;
        }
    }
}

Can you do it? I wrote my example in Perl but I would love to see someone do it in other languages. Post your examples or a pastebin of your code.

Note: I have also worked out this example with PHP without using regular expressions. There are multiple ways of solving this problem.

Need to print shipping labels on your site?

Checkout my product RocketShipIt for simple easy-to-use developer tools for UPS™ FedEx™ USPS™ and more.

Share: