Oracle
 sql >> Base de données >  >> RDS >> Oracle

Regex101 contre Oracle Regex

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