Oracle - 确定正则表达式支持的最大大小

时间:2010-04-22 19:57:33

标签: regex oracle

我有一个抛出ORA-12733的正则表达式,“正则表达式太长”。如何确定支持的最大大小是多少?

仅供参考:违规正则表达式为892个字符。它是一个生成的正则表达式,所以我可以改变生成和执行它的方式,但我想知道在更改生成和执行方式之前,最大大小的限制是什么。

(运行Oracle 10.2g)

更新

如果它取决于实际的正则表达式,这里是它的开头(其余部分重复同样的事情,^$之间的值不同):

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

2 个答案:

答案 0 :(得分:8)

查看正则表达式函数的文档,REGEXP_SUBSTR,REGEXP_INSTR& REGEXP_REPLACE对模式有以下引用:

  

pattern是正则表达式。它通常是一个文本   字面上的,可以是任何一个   数据类型CHAR,VARCHAR2,NCHAR或   NVARCHAR2。 最多可包含512个   字节即可。如果模式的数据类型是   与数据类型不同   source_char,Oracle数据库转换   模式到数据类型   source_char。对于列表   您可以指定的运算符   pattern` **

取自here

答案 1 :(得分:1)

示例正则表达式不应该需要线锚的所有开始/结束。 ^(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;