Oracle
 sql >> Database >  >> RDS >> Oracle

Regex101 vs Oracle Regex

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).