El problema es bien conocido por todos aquellos que trabajaron con las implementaciones de la biblioteca de expresiones regulares de Henry Spencer:los cuantificadores perezosos no deben mezclarse con los cuantificadores codiciosos en la misma rama ya que eso conduce a un comportamiento indefinido. El motor de expresiones regulares TRE utilizado en R muestra el mismo comportamiento. Si bien puede mezclar los cuantificadores perezosos y codiciosos hasta cierto punto, siempre debe asegurarse de obtener un resultado consistente.
La solución es usar solo cuantificadores perezosos dentro del grupo de captura:
select REGEXP_REPLACE('+000099,8420000', '^\+?(-?)0*([0-9]+?,[0-9]+?)0*$','\1\2') as Result from dual
Vea la demostración en línea
El [0-9]+?,[0-9]+?
part coincide con 1 o más dígitos, pero la menor cantidad de veces posible seguido de una coma y luego con 1 o más dígitos, la menor cantidad posible.
Algunas pruebas más (select REGEXP_REPLACE('+00009,010020','[0-9]+,[0-9]+?([1-9])','\1') from dual
produce +20
) probar que el primer cuantificador en un grupo establece el tipo de codicia del cuantificador . En el caso anterior, la codicia del cuantificador del Grupo 0 se establece en codicioso por el primer ?
cuantificador y Grupo 1 (es decir, ([0-9]+?,[0-9]+?)
) el tipo de codicia se establece con el primer +?
(que es perezoso).