Ini BUG!
Anda benar bahwa di Perl, 'A=1,B=2,C=3,' =~ /.*B=.*?,/; print $&
mencetak A=1,B=2,
Apa yang Anda temukan adalah bug yang masih ada di Oracle Database 11g R2. Jika atom ekspresi reguler yang sama persis (termasuk quantifier tetapi tidak termasuk pengubah keserakahan) muncul dua kali dalam ekspresi reguler, kedua kemunculan akan memiliki keserakahan yang ditunjukkan oleh penampilan pertama terlepas dari keserakahan yang ditentukan oleh yang kedua. Bahwa ini adalah bug jelas ditunjukkan oleh hasil ini (di sini, "atom ekspresi reguler yang sama persis" adalah [^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,
Satu-satunya perbedaan antara dua ekspresi reguler adalah bahwa yang "baik" mengecualikan 'x' sebagai kemungkinan kecocokan dalam daftar pencocokan kedua. Karena 'x' tidak muncul di string target, mengecualikannya seharusnya tidak ada bedanya, tetapi seperti yang Anda lihat, menghapus 'x' membuat perbedaan besar. Itu pasti bug.
Berikut adalah beberapa contoh lagi dari Oracle 11.2:(SQL Fiddle dengan lebih banyak contoh )
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,
Polanya konsisten:keserakahan dari kejadian pertama digunakan untuk kejadian kedua apakah itu seharusnya atau tidak.