sql >> Database >  >> RDS >> Oracle

Regex101 versus Oracle Regex

Het probleem is bekend bij iedereen die met Henry Spencer's regex-bibliotheekimplementaties heeft gewerkt:luie kwantoren moeten niet worden verward met hebzuchtige kwantoren in één en dezelfde tak want dat leidt tot ongedefinieerd gedrag. De TRE regex-engine die in R wordt gebruikt, vertoont hetzelfde gedrag. Hoewel je de luie en hebzuchtige kwantoren tot op zekere hoogte kunt mixen, moet je er altijd voor zorgen dat je een consistent resultaat krijgt.

De oplossing is om alleen luie kwantoren te gebruiken binnen de opnamegroep:

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

Bekijk de online demo

De [0-9]+?,[0-9]+? deel komt overeen met 1 of meer cijfers maar zo weinig mogelijk gevolgd door een komma en dan 1 of meer cijfers, zo min mogelijk.

Nog enkele tests (select REGEXP_REPLACE('+00009,010020','[0-9]+,[0-9]+?([1-9])','\1') from dual levert +20 op ) bewijs dat de eerste kwantor in een groep stelt het type hebzucht in de kwantor in . In het bovenstaande geval is hebzucht van groep 0 ingesteld op hebzuchtig door de eerste ? kwantor, en Groep 1 (d.w.z. ([0-9]+?,[0-9]+?) ) het type hebzucht wordt ingesteld met de eerste +? (wat lui is).




  1. Oracle UNION ALL View importeren in Entity Framework EDMX

  2. Ruby, Rails:mysql2 juweeltje, gebruikt iemand dit juweeltje? Is het stabiel?

  3. MySQL-query met telling en groeperen op

  4. Tabellen en schema's opnemen bij het weergeven van de identiteitskolommen in een SQL Server-database