#! perl -slw use strict; my $re = qr[ (.) (?=(.)(.)) (?= .* (?: \1\2\3 | \1\3\2 | \2\1\3 | \2\3\1 | \3\1\2 | \3\2\1 ) .* $) ]x; while( ) { chomp; print "'$_'", $_ !~ m[$re]g ? ' passed' : 'failed'; } __DATA__ abcdbca abcba abcdabe #### P:\test>test3 'abcdbca'failed 'abcba'failed 'abcdabe' passed #### my $re = qr[ (.) (?=(.)(.)) (?= .* (?: \1 (?: \2\3 | \3\2 ) | \2 (?: \1\3 | \3\1 ) | \3 (?: \1\2 | \2\1 ) ) .* $) ]x;