sql >> Base de Datos >  >> RDS >> Oracle

Regex101 frente a Oracle Regex

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