Il problema è ben noto a tutti coloro che hanno lavorato con le implementazioni della libreria regex di Henry Spencer:i quantificatori pigri non dovrebbero essere confusi con quantificatori avidi nello stesso ramo poiché ciò porta a un comportamento indefinito. Il motore TRE regex utilizzato in R mostra lo stesso comportamento. Anche se in una certa misura puoi mescolare i quantificatori pigri e avidi, devi sempre assicurarti di ottenere un risultato coerente.
La soluzione è utilizzare solo quantificatori pigri all'interno del gruppo di acquisizione:
select REGEXP_REPLACE('+000099,8420000', '^\+?(-?)0*([0-9]+?,[0-9]+?)0*$','\1\2') as Result from dual
Guarda la demo online
Il [0-9]+?,[0-9]+?
parte corrisponde a 1 o più cifre ma il minor numero di volte possibile seguita da una virgola e quindi da 1 o più cifre, il meno possibile.
Alcuni altri test (select REGEXP_REPLACE('+00009,010020','[0-9]+,[0-9]+?([1-9])','\1') from dual
restituisce +20
) dimostrare che il primo quantificatore in un gruppo imposta il tipo di avidità del quantificatore . Nel caso precedente, l'avidità del quantificatore del Gruppo 0 è impostata su greedy dal primo ?
quantificatore e Gruppo 1 (ovvero ([0-9]+?,[0-9]+?)
) il tipo di golosità è impostato con il primo +?
(che è pigro).