use Regexp::Common; my $orig = my $str = 'foo bar foo bar foo qux foo qux foo'; $str =~ s{ ( $RE{balanced}{-begin => "bar"}{-end => "qux"} ) | (foo) } { defined $2 ? 123 : $1 }xge; print "$orig\n"; print "$str\n";