#!/usr/bin/perl use warnings; use strict; use re 'eval'; $\ = $/; while(){ print '-' x 15; chomp; my $target = $_; my @groups = split ' ', ; print "target:[$target]"; print "groups:[@groups]"; my @chars_seq; my $re = join " (?!\\g{-1}).*? \n", map { sprintf "(?: " . "( (.)\\g{-1}{%d} ) " . "(?{ push \@chars_seq, \$\^N; }) " . "(?: (?=) | (?{ pop \@chars_seq }) (*FAIL) ) " . "(?{ print join ' ', \@chars_seq; })" . ")" , $_ - 1 } @groups; print for "regex:[", $re, "]"; $re =~ s/\n//g; $target =~ / $re /x or print "FAIL!"; print "character sequence:[@chars_seq]"; } __DATA__ cbaa 1 2 cba 1 bbaa 1 2 cccqrrtaaa 2 2 2 cccqrrtaaa 1 1 2 2 cccqrrtaaa 1 1 1 1 3