Only a small remark:
The idea of variable-length lookbehind is very good, but the given problem can be solved even without using lookbehinds at all:
#!/usr/bin/perl
use warnings;
use strict;
my $pat = qr{
( # 1: capture the whole substring
(?:
(.) # a character
(?!\2\2) # NOT repeated three times
){1,4} # one to four of such 'good' characters
.. # two any characters more; 2+4 = 6
)
}x;
foreach (qw/AABBCCDD AABBBCCD AAABBCCD AABBCCCD AAABCDE/) {
print "$1\n" if /$pat/;
}
outputs
AABBCC
AABB
AABBCC
AABBCC
AABCDE