Oracle
 sql >> Database >  >> RDS >> Oracle

Perché un quantificatore non avido a volte non funziona in Oracle regex?

È un BUG!

Hai ragione sul fatto che in Perl, 'A=1,B=2,C=3,' =~ /.*B=.*?,/; print $& stampa A=1,B=2,

Quello in cui ti sei imbattuto è un bug che esiste ancora in Oracle Database 11g R2. Se la stessa identica espressione regolare atomo (incluso il quantificatore ma escluso il modificatore di avidità) appare due volte in un'espressione regolare, entrambe le occorrenze avranno l'avidità indicata dalla prima apparizione indipendentemente dall'avidità specificata dalla seconda. Che si tratti di un bug è chiaramente dimostrato da questi risultati (qui, "la stessa identica espressione regolare atom" è [^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,

L'unica differenza tra le due espressioni regolari è che quella "buona" esclude "x" come possibile corrispondenza nel secondo elenco di corrispondenza. Poiché 'x' non appare nella stringa di destinazione, escluderla non dovrebbe fare alcuna differenza, ma come puoi vedere, rimuovere la 'x' fa una grande differenza. Deve essere un bug.

Ecco alcuni altri esempi da Oracle 11.2:(SQL Fiddle con ancora più esempi )

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,

Lo schema è coerente:l'avidità della prima occorrenza viene utilizzata per la seconda occorrenza o meno.