sql >> Databasteknik >  >> RDS >> Oracle

Varför fungerar inte en icke girig kvantifierare ibland i Oracles regex?

Det är en BUG!

Du har rätt i att i Perl, 'A=1,B=2,C=3,' =~ /.*B=.*?,/; print $& skriver ut A=1,B=2,

Det du har snubblat över är en bugg som fortfarande finns i Oracle Database 11g R2. Om exakt samma reguljära uttrycksatom (inklusive kvantifieraren men exklusive girighetsmodifieraren) förekommer två gånger i ett reguljärt uttryck, kommer båda förekomsterna att ha den girighet som indikeras av det första utseendet oavsett girigheten som anges av den andra. Att detta är en bugg visas tydligt av dessa resultat (här är "exakt samma reguljära uttrycksatom" [^B]* ):

SQL> SELECT regexp_substr('A=1,B=2,C=3,', '[^B]*B=[^Bx]*?,') as good FROM dual;

GOOD
--------
A=1,B=2,

SQL> SELECT regexp_substr('A=1,B=2,C=3,', '[^B]*B=[^B]*?,') as bad FROM dual;

BAD
-----------
A=1,B=2,C=3,

Den enda skillnaden mellan de två reguljära uttrycken är att det "bra" exkluderar 'x' som en möjlig matchning i den andra matchningslistan. Eftersom 'x' inte visas i målsträngen borde det inte göra någon skillnad att utesluta det, men som du kan se gör det stor skillnad att ta bort 'x'. Det måste vara en bugg.

Här är några fler exempel från Oracle 11.2:(SQL Fiddle med ännu fler exempel )

SELECT regexp_substr('A=1,B=2,C=3,', '.*B=.*?,')  FROM dual; =>  A=1,B=2,C=3,
SELECT regexp_substr('A=1,B=2,C=3,', '.*B=.*,')   FROM dual; =>  A=1,B=2,C=3,
SELECT regexp_substr('A=1,B=2,C=3,', '.*?B=.*?,') FROM dual; =>  A=1,B=2,
SELECT regexp_substr('A=1,B=2,C=3,', '.*?B=.*,')  FROM dual; =>  A=1,B=2,
-- Changing second operator from * to +
SELECT regexp_substr('A=1,B=2,C=3,', '.*B=.+?,')  FROM dual; =>  A=1,B=2,
SELECT regexp_substr('A=1,B=2,C=3,', '.*B=.+,')   FROM dual; =>  A=1,B=2,C=3,
SELECT regexp_substr('A=1,B=2,C=3,', '.+B=.+,')   FROM dual; =>  A=1,B=2,C=3,
SELECT regexp_substr('A=1,B=2,C=3,', '.+?B=.+,')  FROM dual; =>  A=1,B=2,

Mönstret är konsekvent:girigheten i den första förekomsten används för den andra förekomsten oavsett om den borde vara det eller inte.



  1. Få de tomma posterna med SQL

  2. Infoga överordnade/barnregister i en transaktion

  3. Vilket CMS som ska användas för att bygga webbplats med PostreSQL, kan senaste WordPress användas

  4. Att infoga värden i en tabell inom en funktion får ett fel, men när man försöker infoga värden i tabellen utanför en funktion fungerar det bra