my $a = "xx|xx|xx|xxxx|xx|xxx|xx|xx|xx"; $a =~ s/(?<=\|)xx(?=(\||$))/x x/g; print $a; __DATA__ xx|x x|x x|xxxx|x x|xxx|x x|x x|x x #### $a =~ s/(?<=\|)|^xx(?=(\||$))/x x/g; # and here is a way using the zero width boundary assertion \b # that will match | ^ or $ but also matches any non aphlanumeric # so would potentially fail on '|xx,xx|' type strings # if they exist in practice as your real data is no doubt # not really xx..... $a =~ s/\bxx\b/x x/g;