Le problème est bien connu de tous ceux qui ont travaillé avec les implémentations de la bibliothèque regex d'Henry Spencer :les quantificateurs paresseux ne doivent pas être confondus avec les quantificateurs gourmands dans une seule et même branche car cela conduit à un comportement indéfini. Le moteur TRE regex utilisé dans R montre le même comportement. Bien que vous puissiez mélanger les quantificateurs paresseux et gourmands dans une certaine mesure, vous devez toujours vous assurer d'obtenir un résultat cohérent.
La solution consiste à n'utiliser que des quantificateurs paresseux à l'intérieur du groupe de capture :
select REGEXP_REPLACE('+000099,8420000', '^\+?(-?)0*([0-9]+?,[0-9]+?)0*$','\1\2') as Result from dual
Voir la démo en ligne
Le [0-9]+?,[0-9]+?
partie correspond à 1 ou plusieurs chiffres mais le moins de fois possible suivi d'une virgule puis d'un ou plusieurs chiffres, le moins possible.
Quelques tests supplémentaires (select REGEXP_REPLACE('+00009,010020','[0-9]+,[0-9]+?([1-9])','\1') from dual
donne +20
) prouver que le premier quantificateur d'un groupe définit le type de gourmandise du quantificateur . Dans le cas ci-dessus, la gourmandise du quantificateur du groupe 0 est définie sur gourmand par le premier ?
quantificateur et groupe 1 (c'est-à-dire ([0-9]+?,[0-9]+?)
) le type de gourmandise est défini avec le premier +?
(ce qui est paresseux).