Perché regex è avido per impostazione predefinita. Cioè. le espressioni .* o .+ cerca di prendere quanti più caratteri possibile. Pertanto <.+> si estenderà dal primo < all'ultimo > . Rendilo pigro usando l'operatore pigro ? :
regexp_replace(teststring, '<.+?>')
o
regexp_replace(teststring, '<.*?>')
Ora, la ricerca di > si fermerà al primo > incontrato.
Nota che . include > pure, quindi la variante greedy (senza ? ) ingoia tutto il > ma l'ultimo.