Porque regex é ganancioso por padrão. Ou seja as expressões
.* ou .+ tente pegar o máximo de caracteres possível. Portanto <.+> abrangerá desde o primeiro < até o último > . Torne-o preguiçoso usando o operador preguiçoso ? :regexp_replace(teststring, '<.+?>')
ou
regexp_replace(teststring, '<.*?>')
Agora, a busca por
> irá parar no primeiro > encontrado. Observe que
. inclui > também, portanto, a variante gananciosa (sem ? ) engole todo o > mas o último.