sql >> Databasteknik >  >> RDS >> Oracle

Regex101 vs Oracle Regex

Problemet är välkänt för alla som arbetat med Henry Spencers regex-biblioteksimplementeringar:lata kvantifierare ska inte blandas ihop med giriga kvantifierare i en och samma gren eftersom det leder till odefinierat beteende. TRE regex-motorn som används i R visar samma beteende. Även om du kan blanda de lata och giriga kvantifierarna till viss del, måste du alltid se till att du får ett konsekvent resultat.

Lösningen är att endast använda lata kvantifierare inom fångstgruppen:

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

Se onlinedemon

[0-9]+?,[0-9]+? del matchar 1 eller flera siffror men så få gånger som möjligt följt av ett kommatecken och sedan 1 eller flera siffror, så få som möjligt.

Några fler tester (välj REGEXP_REPLACE('+00009,010020','[0-9]+,[0-9]+?([1-9])','\1') från dubbel ger +20 ) bevisa att den första kvantifieraren i en grupp ställer in kvantifieraren girighetstyp . I fallet ovan är grupp 0 kvantifierare girighet inställd på greedy av den första ? kvantifierare och grupp 1 (dvs. ([0-9]+?,[0-9]+?) ) girighetstyp ställs in med den första +? (vilket är lat).




  1. Finns det en SELECT ... INTO OUTFILE-motsvarighet i SQL Server Management Studio?

  2. Windows Service i .net kan inte lösa tns tjänstnamn

  3. INNODB kaskad vid radering och uppdatering

  4. JDBC :hämta typen av en array från metadata