2010-04-22 37 views
6

Tengo una expresión regular que arroja ORA-12733, "la expresión regular es demasiado larga". ¿Cómo determino cuál es el tamaño máximo soportado?Oracle: determinar el tamaño máximo admitido para la expresión regular

FYI: la expresión regular ofensiva es de 892 caracteres. Es una expresión regular generada, por lo que podría cambiar la forma en que la genero y la ejecuto, pero me gustaría saber cuáles son los límites del tamaño máximo antes de cambiar cómo estoy generando y ejecutando.

(que se ejecuta Oracle 10,2 g)

ACTUALIZACIÓN:

Si depende de la expresión regular real, aquí está el comienzo de la misma (el resto es sólo la misma cosa repetida, con diferentes valores entre ^ y $):

(^R_1A$|^R_2A$|^R_3A$|^R_4A$|^R_4B$|^R_5A$|^R_5B$ ...

Respuesta

8

en cuanto a la documentación de las funciones de expresiones regulares, REGEXP_SUBS TR, REGEXP_INSTR & REGEXP_REPLACE que tiene la siguiente cita para el patrón:

patrón es la expresión regular. Suele ser un texto literal y puede ser de cualquiera de los tipos de datos CHAR, VARCHAR2, NCHAR o NVARCHAR2. Puede contener hasta 512 bytes. Si el tipo de datos del patrón es diferente del tipo de datos source_char, Oracle Database convierte el patrón en el tipo de datos source_char. Para obtener una lista de los operadores puede especificar en pattern` **

Tomado de here

+0

Aha, por lo que es de 512 bytes. ¡Gracias! – FrustratedWithFormsDesigner

1

La expresión regular muestra no debería necesitar todo el inicio/final de los anclajes de línea. ^(R_1A|R_2A|R_3A|R_4A|R_4B|R_5A|R_5B)$ funcionaría igual de bien.

En realidad: si los tokens de búsqueda son en realidad similares a los de la muestra, uno podría desear beneficiarse con ^(R_[1-5]A|R_[4-5]B)$ o ^(R_([1-5]A|[4-5]B))$ (para la parte de la cadena de búsqueda dada en la pregunta).

verificado en 11,2:

SELECT i, t FROM (
    SELECT 1 i, 'R_1A' t FROM DUAL UNION ALL 
    SELECT 2, 'xR_2A' FROM DUAL UNION ALL 
    SELECT 3, 'R_3Ax' FROM DUAL UNION ALL 
    SELECT 4, 'xR_4Ax' FROM DUAL UNION ALL 
    SELECT 5, 'R_4B' FROM DUAL UNION ALL 
    SELECT 6, 'R_5A' FROM DUAL UNION ALL 
    SELECT 7, 'R_5B' FROM DUAL) 
--WHERE REGEXP_LIKE(t, '(^R_1A$|^R_2A$|^R_3A$|^R_4A$|^R_4B$|^R_5A$|^R_5B$)') 
--WHERE REGEXP_LIKE(t, '^(R_1A|R_2A|R_3A|R_4A|R_4B|R_5A|R_5B)$') 
--WHERE REGEXP_LIKE(t, '^(R_[1-5]A|R_[4-5]B)$') 
WHERE REGEXP_LIKE(t, '^(R_([1-5]A|[4-5]B))$') 
ORDER BY i; 
Cuestiones relacionadas