我有一个抛出ORA-12733的正则表达式,“正则表达式太长”。如何确定支持的最大大小是多少?
仅供参考:违规正则表达式为892个字符。它是一个生成的正则表达式,所以我可以改变生成和执行它的方式,但我想知道在更改生成和执行方式之前,最大大小的限制是什么。
(运行Oracle 10.2g)
更新
如果它取决于实际的正则表达式,这里是它的开头(其余部分重复同样的事情,^
和$
之间的值不同):
(^R_1A$|^R_2A$|^R_3A$|^R_4A$|^R_4B$|^R_5A$|^R_5B$
...
答案 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;