O problema é bem conhecido por todos aqueles que trabalharam com as implementações da biblioteca regex de Henry Spencer:quantificadores preguiçosos não devem ser misturados com quantificadores gananciosos em um mesmo ramo já que isso leva a um comportamento indefinido. O mecanismo TRE regex usado em R mostra o mesmo comportamento. Embora você possa misturar os quantificadores preguiçosos e gananciosos até certo ponto, você deve sempre certificar-se de obter um resultado consistente.
A solução é usar apenas quantificadores lentos dentro do grupo de captura:
select REGEXP_REPLACE('+000099,8420000', '^\+?(-?)0*([0-9]+?,[0-9]+?)0*$','\1\2') as Result from dual
Veja a demonstração on-line
O
[0-9]+?,[0-9]+?
parte corresponde a 1 ou mais dígitos, mas o menor número de vezes possível seguido de uma vírgula e, em seguida, 1 ou mais dígitos, o mínimo possível. Mais alguns testes (
selecione REGEXP_REPLACE('+00009,010020','[0-9]+,[0-9]+?([1-9])','\1') de dual rende +20
) provam que o primeiro quantificador em um grupo define o tipo de ganância do quantificador . No caso acima, a ganância do quantificador do Grupo 0 é definida como ganancioso pelo primeiro ?
quantificador e Grupo 1 (ou seja, ([0-9]+?,[0-9]+?)
) o tipo de ganância é definido com o primeiro +?
(que é preguiçoso).