Oracle
 sql >> база данни >  >> RDS >> Oracle

Защо не-алчен квантор понякога не работи в Oracle regex?

Това е ГРЕШКА!

Прав си, че в 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,

Моделът е последователен:алчността на първото появяване се използва за второто появяване, независимо дали трябва или не.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да Oracle XMLTYPE в Hibernate

  2. Oracle SQL поставя стойности на колона в един ред

  3. Как да изчистите всички кеширани елементи в Oracle

  4. Начало на Oracle само за четене

  5. Функция TO_DATE в ORACLE