Oracle - определить максимальный поддерживаемый размер для регулярного выражения - PullRequest
6 голосов
/ 22 апреля 2010

У меня есть регулярное выражение, которое выдает ORA-12733, "регулярное выражение слишком длинное". Как определить максимальный поддерживаемый размер?

К вашему сведению: оскорбительное регулярное выражение содержит 892 символа. Это сгенерированное регулярное выражение, поэтому я мог бы изменить способ его генерации и выполнения, но я хотел бы знать, каковы ограничения на максимальный размер, прежде чем изменить способ генерации и выполнения.

(работает Oracle 10.2g)

UPDATE:

Если это зависит от фактического регулярного выражения, вот его начало (все остальное повторяется с разными значениями от ^ до $):

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

Ответы [ 2 ]

8 голосов
/ 23 апреля 2010

Глядя на документацию по функциям регулярных выражений, REGEXP_SUBSTR, REGEXP_INSTR & REGEXP_REPLACE, он имеет следующую цитату для шаблона:

шаблон - это регулярное выражениеОбычно это текстовый литерал и может иметь любой из типов данных CHAR, VARCHAR2, NCHAR или NVARCHAR2. Может содержать до 512 байт .Если тип данных pattern отличается от типа данных source_char, Oracle Database преобразует шаблон в тип данных source_char.Для списка операторов вы можете указать в шаблоне `**

Взят от здесь

1 голос
/ 06 ноября 2014

Образцу регулярного выражения не нужны все якоря начала / конца строки. ^(R_1A|R_2A|R_3A|R_4A|R_4B|R_5A|R_5B)$ будет работать так же хорошо.

На самом деле: если токены поиска действительно такие же, как в примере, можно воспользоваться этим с помощью ^(R_[1-5]A|R_[4-5]B)$ или ^(R_([1-5]A|[4-5]B))$ (для части строки поиска, указанной в вопросе).

Проверено в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...