http://qs321.pair.com?node_id=328207

tos has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks,

a colleague of mine came to me with a question on a special regex which has to decide whether a given pw is valid or not. The pw has to suffice the following restrictions:

I agreed to him that this requirement isn't trivial. But on the other side I told him that i could imagine a really short solution. Perhaps i leaned out of the window a bit too wide, because after a little fiddling i got this:

#!/usr/bin/perl -w # vim: set tabstop=3 use strict; while (<DATA>) { chomp; print "\n$_\n"; length() < 5 && do { print "too short\n"; next }; length() > 8 && do { print "too long\n"; next }; m# ^ \w*[a-z]\w*[A-Z]\w*[0-9]\w*| \w*[a-z]\w*[0-9]\w*[A-Z]\w*| \w*[A-Z]\w*[a-z]\w*[0-9]\w*| \w*[A-Z]\w*[0-9]\w*[a-z]\w*| \w*[0-9]\w*[A-Z]\w*[a-z]\w*| \w*[0-9]\w*[a-z]\w*[A-Z]\w* $ #x ? print "valid\n" : print "invalid (Input must have at least one lowercase-, " . "one uppercase-Char and one Number! (f.i.: \'12Three +\')\n"; } __DATA__ 1245Za78 1245Za7b8 45a7b8 a78Z 12Three kMdlOz 6KYX diImMU1Y ZNw4uWSht jDqvSN qVRR le2WTQv us1j3SerC OZv0LtSJ 9qyscg LbX7o74 80TeRHq 7YIiXnEV8 e1Yctl9 8iGoc R87MeDCFz ziTnlk cziP

This solution is quite good but appears a little bulky to me. Especially a more compact regex would be nice. Perhaps the length-validation could be made within the regex too.

I wonder who has THE solution which combines shortness and elegance in a tremendous way ;)

regards, tos

janitored by ybiC: Balanced <readmore> tags, minor format cleanup for legibility