Het is een BUG!
Je hebt gelijk dat in Perl, 'A=1,B=2,C=3,' =~ /.*B=.*?,/; print $&
. af drukt A=1,B=2,
Wat u bent tegengekomen, is een bug die nog steeds bestaat in Oracle Database 11g R2. Als exact hetzelfde atoom van de reguliere expressie (inclusief de kwantor maar exclusief de greediness-modifier) twee keer voorkomt in een reguliere expressie, zullen beide gevallen de hebzucht hebben die wordt aangegeven door de eerste verschijning, ongeacht de hebzucht die wordt gespecificeerd door de tweede. Dat dit een bug is, wordt duidelijk aangetoond door deze resultaten (hier, "exact dezelfde reguliere expressie-atoom" is [^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,
Het enige verschil tussen de twee reguliere expressies is dat de "goede" 'x' uitsluit als een mogelijke overeenkomst in de tweede overeenkomende lijst. Aangezien 'x' niet voorkomt in de doelreeks, zou het uitsluiten ervan geen verschil moeten maken, maar zoals u kunt zien, maakt het verwijderen van de 'x' een groot verschil. Dat moet een bug zijn.
Hier zijn nog enkele voorbeelden van Oracle 11.2:(SQL Fiddle met nog meer voorbeelden )
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,
Het patroon is consistent:de hebzucht van de eerste keer wordt gebruikt voor de tweede keer, of het nu moet of niet.