in reply to I don't remember regex seeming this hard before

Use a regex that calls itself.
#!/usr/bin/perl my $qr; $qr = qr!(?:\<(?:(?>[^\<\>]+)|(??{$qr}))*\>)!; $_ = "<<a> a> a <a>"; s/($qr)/\U$1/g; print;
Boris