Parce que regex est gourmand par défaut. C'est à dire. les expressions .* ou .+ essayez de prendre autant de caractères que possible. Donc <.+> s'étendra du premier < jusqu'au dernier > . Rendez-le paresseux en utilisant l'opérateur paresseux ? :
regexp_replace(teststring, '<.+?>')
ou
regexp_replace(teststring, '<.*?>')
Maintenant, la recherche de > s'arrêtera au premier > rencontré.
Notez que . inclut > ainsi, donc la variante gourmande (sans ? ) avale tous les > mais le dernier.