Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dlaczego nie zachłanny kwantyfikator czasami nie działa w wyrażeniu regularnym Oracle?

To BŁĄD!

Masz rację, że w Perlu 'A=1,B=2,C=3,' =~ /.*B=.*?,/; print $& drukuje A=1,B=2,

Natknąłeś się na błąd, który nadal istnieje w Oracle Database 11g R2. Jeśli dokładnie ten sam atom wyrażenia regularnego (w tym kwantyfikator, ale z wyłączeniem modyfikatora zachłanności) pojawia się dwukrotnie w wyrażeniu regularnym, oba wystąpienia będą miały zachłanność wskazaną przez pierwsze pojawienie się, niezależnie od zachłanności określonej przez drugie. Te wyniki wyraźnie pokazują, że jest to błąd (tutaj "dokładnie ten sam atom wyrażenia regularnego" to [^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,

Jedyna różnica między tymi dwoma wyrażeniami regularnymi polega na tym, że „dobre” wyklucza „x” jako możliwe dopasowanie z drugiej listy dopasowań. Ponieważ „x” nie pojawia się w łańcuchu docelowym, wykluczenie go nie powinno mieć znaczenia, ale jak widać, usunięcie „x” robi dużą różnicę. To musi być błąd.

Oto kilka przykładów z Oracle 11.2:(SQL Fiddle z jeszcze większą liczbą przykładów )

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,

Wzorzec jest spójny:chciwość z pierwszego wystąpienia jest używana w drugim wystąpieniu, niezależnie od tego, czy ma być, czy nie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wykonać procedurę składowaną Oracle za pośrednictwem łącza do bazy danych

  2. Problem z ładowaniem Oracle.DataAccess.Dll na komputerze x-64

  3. Jak zainstalować bazę danych Oracle w systemie Windows

  4. Obsługa wyjątków w pl/sql

  5. Wyrażenia regularne _# na końcu ciągu