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.

c:\@Work\Perl\monks>perl -wMstrict -le "my $s = '&amp; &amp;lt; &amp;gt; &lt; &gt; &amp;&lt; &amp;&amp; +'; 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'}; " '&amp; &amp;lt; &amp;gt; &lt; &gt; &amp;&lt; &amp;&amp;' '& &lt; &gt; < > &< &&'
(But I'm not sure how you would translate this to Java! (Maybe ask on a Java site?))

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 = '&amp; &amp;lt; &amp;gt; &lt; &gt; &amp;&lt; &amp;&amp; +'; 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'}; " '&amp; &amp;lt; &amp;gt; &lt; &gt; &amp;&lt; &amp;&amp;' (?^msx: lt | gt | amp ) '& &lt; &gt; < > &< &&'