# The golfish way: $text =~ s#(\s)\s+|STARTPRESERVE(.*?)STOPPRESERVE#$1$2#gs; # Update: Oops! This fails if a run # of whitespace doesn't start with ' '. # or, if you don't like warnings: $text =~ s#\s{2,}|STARTPRESERVE(.*?)STOPPRESERVE# defined $1 ? $1 : " " #seg;