c:\@Work\Perl\monks>perl -wMstrict -le "for my $word (qw(XYZ$-.%abc&/ $-.%abc&/XYZ $-.%abc&/XYZ+=*)) { my @group1 = ( $word =~ m/(?: ([^a-zA-Z]+) ([a-zA-Z]+) )+ ([^a-zA-Z]+) /x ); my @group2 = map { $_ =~ /[a-zA-Z]/ ? split( //, $_ ) : $_ } @group1; my $new_word = join ( '', map { qq{[$_]} } @group2 ); print qq{'$word' -> '$new_word'}; } " 'XYZ$-.%abc&/' -> '[$-.%][a][b][c][&/]' '$-.%abc&/XYZ' -> '[$-.%][a][b][c][&/]' '$-.%abc&/XYZ+=*' -> '[&/][X][Y][Z][+=*]'