in reply to Avoid recursive replacement using regex
Another way. This has the advantage of being completely independent of ordering of operations, and more replacement string mappings can easily be added to the %replace hash.
(But I'm not sure how you would translate this to Java! (Maybe ask on a Java site?))c:\@Work\Perl\monks>perl -wMstrict -le "my $s = '& &lt; &gt; < > &< && +'; print qq{'$s'}; ;; my %replace = ( amp => '&', lt => '<', gt => '>', ); my ($find) = map qr{ & ($_) ; }xms, join '|', keys %replace ; $s =~ s{$find}{$replace{$1}}xmsg; print qq{'$s'}; " '& &lt; &gt; < > &< &&' '& < > < > &< &&'
Update: Here's a variation that has the advantage of avoiding what I think of as 'hidden' capture groups in qr// objects: captures that can confuse group counting when these objects are used to compose larger regexes. In the following, all captures are at the 'top' level in the m// match, so counting's easy.
c:\@Work\Perl\monks>perl -wMstrict -le "my $s = '& &lt; &gt; < > &< && +'; print qq{'$s'}; ;; my %replace = ( amp => '&', lt => '<', gt => '>', ); my ($entity) = map qr{ $_ }xms, join ' | ', keys %replace ; print $entity; ;; $s =~ s{ & ($entity) ; }{$replace{$1}}xmsg; print qq{'$s'}; " '& &lt; &gt; < > &< &&' (?^msx: lt | gt | amp ) '& < > < > &< &&'
|
|---|