【问题标题】:Oracle - Determine maximum supported size for regular expressionOracle - 确定正则表达式的最大支持大小
【发布时间】:2011-02-11 05:58:45
【问题描述】:

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

仅供参考:有问题的正则表达式是 892 个字符。这是一个生成的正则表达式,因此我可以更改生成和执行它的方式,但我想知道在更改生成和执行方式之前对最大大小的限制是什么。

(运行 Oracle 10.2g)

更新:

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

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

【问题讨论】:

    标签: regex oracle


    【解决方案1】:

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

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

    取自here

    【讨论】:

    • 啊哈,原来是 512 字节。谢谢!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多