use strict; use warnings; my $content = do{local $/; }; $content =~ s/((?:(?:(?!<\/surname>).)*)<\/surname>\,?\s*(?:(?:(?!<\/givenname>).)*)<\/givenname>)/$1<\/au>/gsi; $content =~ s/(<\/givenname>\,\s*)(\s*)/$1$2/gis; $content =~ s/(<\/givenname>\s*)<\/au>(\,\s*)/$1$2/gis; $content =~ s/((?:(?:(?!<\/givenname>).)*)<\/givenname>\,?\s*(?:(?:(?!<\/surname>).)*)<\/surname>)/$1<\/au>/gsi; print $content; __DATA__ Coff, D., et al., J. Amat Coffman, D.D., D.,, Coff et al., J. Amat Coffman, D.D., output: ------- Coff, D.,, Coff, D., D.,, Coff, D.,, Coff