Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Mengapa quantifier yang tidak serakah terkadang berfungsi di Oracle regex?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pindah Dari LINQpad ke Proyek Visual Studio yang Tepat?

  2. Tomcat 9 dengan Apache DBCP + Spring 5 + Oracle 12c + SqlArrayValue

  3. Apakah Oracle DB mendukung beberapa operasi (paralel) per koneksi?

  4. Oracle ExecuteScalar dalam pemrograman paralel terkadang mengembalikan null

  5. pilih baris ke-2 di Plsql