sql >> Databáze >  >> RDS >> Oracle

Regex101 vs Oracle Regex

Tento problém je dobře znám všem, kteří pracovali s implementacemi knihovny regexů Henryho Spencera:líné kvantifikátory by se neměly míchat s chamtivými kvantifikátory v jedné a téže větvi protože to vede k nedefinovanému chování. Motor regulárního výrazu TRE použitý v R vykazuje stejné chování. I když můžete do určité míry míchat líné a chamtivé kvantifikátory, musíte se vždy ujistit, že získáte konzistentní výsledek.

Řešením je používat pouze líné kvantifikátory uvnitř skupiny zachycení:

select REGEXP_REPLACE('+000099,8420000', '^\+?(-?)0*([0-9]+?,[0-9]+?)0*$','\1\2') as Result from dual

Podívejte se na online demo

[0-9]+?,[0-9]+? část odpovídá 1 nebo více číslicím, ale pokud možno co nejméně, následuje čárka a poté 1 nebo více číslic, pokud možno co nejméně.

Některé další testy (vyberte REGEXP_REPLACE('+00009,010020','[0-9]+,[0-9]+?([1-9])','\1') z duálního dává +20 ) prokázat, že první kvantifikátor ve skupině nastavuje typ greediness kvantifikátoru . Ve výše uvedeném případě je chamtivost kvantifikátoru skupiny 0 nastavena na chtivost podle prvního ? kvantifikátor a skupina 1 (tj. ([0-9]+?,[0-9]+?) ) typ chamtivosti je nastaven s prvním +? (což je líné).




  1. MySQL KDE `znak` ='a' odpovídá a, A, Ã atd. Proč?

  2. Postgres Npgsql Connection Pooling

  3. Po připojení k databázi přepněte roli

  4. arabský text se ukládá jako ???