Win8 Strawberry 5.8.9.5 (32) Sun 06/05/2022 5:38:06 C:\@Work\Perl\monks >perl use strict; use warnings; my $s = 'AAAAAXXXXXXXAAAXXXXXAXXXXAAAA'; print "'$s' \n"; $s =~ s{ (?: \G (?! \A) | (?<= A)) X (?= X* A) }{a}xmsg; print "'$s' \n"; ^Z 'AAAAAXXXXXXXAAAXXXXXAXXXXAAAA' 'AAAAAaaaaaaaAAAaaaaaAaaaaAAAA' #### Win8 Strawberry 5.8.9.5 (32) Sun 06/05/2022 6:52:29 C:\@Work\Perl\monks >perl use strict; use warnings; my %replace = map { 'X' x $_ => 'a' x $_ } 1, 3, 7; my ($rx_search) = map qr{ $_ }xms, join ' | ', map quotemeta, reverse sort keys %replace ; # print "\$rx_search $rx_search \n"; # for debug for my $s ( 'AAAAAXXXXXXXAAAXXXXXAXXXXAAAA', 'XXXXXXXAAAXXXXXAXXXX', 'AXA', 'XXXXXXXXXXX', 'AAAAAAAAAAA', 'XA', 'AX', 'X', 'A', '', ) { print "'$s' \n"; (my $t = $s) =~ s{ (?: \G (?! \A) | (?<= A)) ($rx_search) (?= X* A) } {$replace{$1}}xmsg; print "'$t' \n\n"; } ^Z 'AAAAAXXXXXXXAAAXXXXXAXXXXAAAA' 'AAAAAaaaaaaaAAAaaaaaAaaaaAAAA' 'XXXXXXXAAAXXXXXAXXXX' 'XXXXXXXAAAaaaaaAXXXX' 'AXA' 'AaA' 'XXXXXXXXXXX' 'XXXXXXXXXXX' 'AAAAAAAAAAA' 'AAAAAAAAAAA' 'XA' 'XA' 'AX' 'AX' 'X' 'X' 'A' 'A' '' ''