Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Regex101 vs Oracle Regex


O problema é bem conhecido por todos aqueles que trabalharam com as implementações da biblioteca regex de Henry Spencer:quantificadores preguiçosos não devem ser misturados com quantificadores gananciosos em um mesmo ramo já que isso leva a um comportamento indefinido. O mecanismo TRE regex usado em R mostra o mesmo comportamento. Embora você possa misturar os quantificadores preguiçosos e gananciosos até certo ponto, você deve sempre certificar-se de obter um resultado consistente.

A solução é usar apenas quantificadores lentos dentro do grupo de captura:
select REGEXP_REPLACE('+000099,8420000', '^\+?(-?)0*([0-9]+?,[0-9]+?)0*$','\1\2') as Result from dual

Veja a demonstração on-line

O [0-9]+?,[0-9]+? parte corresponde a 1 ou mais dígitos, mas o menor número de vezes possível seguido de uma vírgula e, em seguida, 1 ou mais dígitos, o mínimo possível.

Mais alguns testes (selecione REGEXP_REPLACE('+00009,010020','[0-9]+,[0-9]+?([1-9])','\1') de dual rende +20 ) provam que o primeiro quantificador em um grupo define o tipo de ganância do quantificador . No caso acima, a ganância do quantificador do Grupo 0 é definida como ganancioso pelo primeiro ? quantificador e Grupo 1 (ou seja, ([0-9]+?,[0-9]+?) ) o tipo de ganância é definido com o primeiro +? (que é preguiçoso).