Това е ГРЕШКА!
Прав си, че в Perl, 'A=1,B=2,C=3,' =~ /.*B=.*?,/; print $&
отпечатва A=1,B=2,
Това, на което се натъкнахте, е грешка, която все още съществува в Oracle Database 11g R2. Ако абсолютно същият атом на регулярен израз (включително квантора, но без модификатора на алчността) се появи два пъти в регулярен израз, и двете срещания ще имат алчността, посочена от първата поява, независимо от алчността, посочена от втората. Че това е грешка, е ясно демонстрирано от тези резултати (тук „същият атом на регулярен израз“ е [^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,
Единствената разлика между двата регулярни израза е, че „добрият“ изключва „x“ като възможно съвпадение във втория списък за съвпадение. Тъй като 'x' не се появява в целевия низ, изключването му не би трябвало да има значение, но както виждате, премахването на 'x' има голяма разлика. Това трябва да е грешка.
Ето още няколко примера от Oracle 11.2:(SQL Fiddle с още повече примери )
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,
Моделът е последователен:алчността на първото появяване се използва за второто появяване, независимо дали трябва или не.