sql >> Base de Datos >  >> RDS >> Oracle

¿Por qué un cuantificador no codicioso a veces no funciona en Oracle regex?

¡Es un ERROR!

Tienes razón en que en Perl, 'A=1,B=2,C=3,' =~ /.*B=.*?,/; print $& imprime A=1,B=2,

Lo que encontró es un error que aún existe en Oracle Database 11g R2. Si exactamente el mismo átomo de expresión regular (incluido el cuantificador pero excluyendo el modificador de codicia) aparece dos veces en una expresión regular, ambas apariciones tendrán la codicia indicada por la primera aparición, independientemente de la codicia especificada por la segunda. Estos resultados demuestran claramente que se trata de un error (aquí, "exactamente el mismo átomo de expresión regular" es [^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,

La única diferencia entre las dos expresiones regulares es que la "buena" excluye 'x' como una posible coincidencia en la segunda lista de coincidencias. Dado que 'x' no aparece en la cadena de destino, excluirla no debería suponer ninguna diferencia, pero como puede ver, eliminar la 'x' supone una gran diferencia. Eso tiene que ser un error.

Aquí hay algunos ejemplos más de Oracle 11.2:(SQL Fiddle con aún más ejemplos )

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,

El patrón es consistente:la codicia de la primera ocurrencia se usa para la segunda ocurrencia, ya sea que se deba o no.