s/ & (?! (?: # (?: x[\da-f]+ | \d+ ) | [a-z]+ ) ; ) /&/xi #### local our %known = map { $_ => 1 } qw( eacute Eacute ecirc Ecirc ... ); s/ & (?! (?: \# (?: x[\da-f]+ | \d+ ) | ([a-z]+) (?(?{ !$known{$1} }) (?!) ) ) ; ) /&/xi #### 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