in reply to Password Regex extended

Counting in regexes is hard to impossible. One way around this is to write a regex that matches ($digits,$upper,$lower)|($digits,$upper,$extra)|....

Since that's no fun, you can generate it by program:

my @chunks = map qr{(?=.*$_)}, ( qr{\d}, qr{[a-z]}, qr{[A-Z]}, qr{[@#$%^&+=]}, ); my @transformed; for my $i (0..$#chunks) { my $r = ''; for my $j (0..$#chunks) { $r .= $chunks[$j] if $j != $i; } push @transformed, $r; } my $regex = = join '|', @transformed; $regex = qr{^.*(?=.{10,})(?:$regex)};

(untested)

But it's much easier to keep the four regexes separate, and in ordinary perl code count how many matched:

my $count = 0; for (@chunks) { $count++ if $str =~ $_; }
Perl 6 - links to (nearly) everything that is Perl 6.