use Regexp::List qw( ); my @known = qw( eacute Eacute ecirc Ecirc ... ); my $known = Regexp::List->new()->list2re(@known); s/ & (?! (?: \# (?: x[\da-f]+ | \d+ ) | $known ) ; ) /&/xi