c:\@Work\Perl\monks>perl -wMstrict -le "use 5.010; ;; my $x = q{((A & B)' | (A & C & (A & B & D | (A & (B' & D)')'))}; print qq{:$x:}; ;; my $parenthetic = qr{ ( [(] (?: [^()]*+ | (?R))* [)] ) }xms; my $term = qr{ ( [[:alpha:]] \w* ) }xms; ;; 1 while $x =~ s{ (?: $parenthetic | $term) \x27 }{ '!' . ($1 // $2) }xmsge; print qq{:$x:}; " :((A & B)' | (A & C & (A & B & D | (A & (B' & D)')')): :(!(A & B) | (A & C & (A & B & D | !(A & !(!B & D)))):