Det er en FEJL!
Du har ret i, at i Perl, 'A=1,B=2,C=3,' =~ /.*B=.*?,/; print $&
udskriver A=1,B=2,
Det, du er stødt på, er en fejl, der stadig eksisterer i Oracle Database 11g R2. Hvis det nøjagtige samme regulære udtryksatom (inklusive kvantifieren, men ekskluderet grådighedsmodifikatoren) optræder to gange i et regulært udtryk, vil begge forekomster have den grådighed, der er angivet ved den første optræden, uanset den grådighed, der er specificeret af den anden. At dette er en fejl er tydeligt demonstreret af disse resultater (her er "det nøjagtige samme regulære udtryk atom" [^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 eneste forskel mellem de to regulære udtryk er, at det "gode" udelukker 'x' som et muligt match i den anden matchende liste. Da 'x' ikke vises i målstrengen, burde det ikke gøre nogen forskel at ekskludere det, men som du kan se, gør det en stor forskel at fjerne 'x'et. Det må være en fejl.
Her er nogle flere eksempler fra Oracle 11.2:(SQL Fiddle med endnu flere eksempler )
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 er konsekvent:grådigheden ved den første forekomst bruges til den anden forekomst, uanset om den skulle være det eller ej.