【问题标题】:ORA-12728: invalid range in regular expressionORA-12728: 正则表达式中的无效范围
【发布时间】:2014-11-23 05:21:23
【问题描述】:

我想检查是否在表格中插入了有效的电话号码,所以我的触发代码在这里:

 select start_index
              into mob_index
              from gmarg_mobile_operators
              where START_INDEX = substr(:new.contact_info,0,3);

              if (REGEXP_LIKE (:NEW.CONTACT_INFO,'^(?:'|| mob_index ||')[\-,\:]{0,1}[0-9][0-9][\-,\:]{0,1}[0-9][0-9][\-,\:]{0,1}[0-9][0-9]')) then
                found := 1;
              end if;

我检查了我的正则表达式:“^(?:555)[-,:]{0,1}[0-9][0-9][-,:]{0,1}[0- 9][0-9][-,:]{0,1}[0-9][0-9]" 在几个在线工具上都是正确的。

当我运行我的触发器时,它编译成功,但在插入一行时显示以下错误:

 insert into GMARG_CONTACTS
(CLINET_ID,CONTACT_INFO,contact_type_id)
values
(0,'555194117','Mobile')
Error report -
SQL Error: ORA-12728: invalid range in regular expression
ORA-06512: at "HR.GMARG_TRIGGER_CONTACT", line 12
ORA-04088: error during execution of trigger 'HR.GMARG_TRIGGER_CONTACT'
12728. 00000 -  "invalid range in regular expression"
*Cause:    An invalid range was found in the regular expression.
*Action:   Ensure a valid range is being used.

那么,如果我的正则表达式是正确的,为什么 oracle 会显示错误? 我试图找到答案,或重新定义我的正则表达式,但没有前进的步骤...... 提前谢谢你

【问题讨论】:

    标签: sql regex oracle


    【解决方案1】:

    正则表达式不要使用\ 来保护括号表达式中的-。您只需将- 作为第一个字符,就在左括号之后:

    IF REGEXP_LIKE('--,,::', '[\-,:]*')
    ...
    
    => ORA-12728: invalid range in regular expression
    

    如果你很好奇,当遇到[\-,:] Oracle 时,请理解:“从\, 或字符: 范围内的任何字符”。这引发异常的原因是 \ 根据它们的 ASCII 值,似乎是 after ,。并且 Oracle 不接受 range 在结束值之后具有起始值。

    另一方面:

     IF REGEXP_LIKE('--,,::', '[-,:]*')
    

    按预期工作。


    作为旁注,[-,:]{0,1} 表示 -,: 出现零次或一次” 可以写成 [-,:]?

    【讨论】:

    • @GiorgiMargiani 请注意,这可能仅适用于 oracle。在大多数其他正则表达式引擎中,您确实会使用反斜杠来转义破折号。再说一次,将破折号简单地放在字符类的开头/结尾会更安全。
    • @Jerry not "only for Oracle": GNU grep 也从字面上解释 \ 。可能还有其他使用标准正则表达式的 Unix/Linux 工具。要测试,请尝试echo '\' | grep '[,\-]' && echo ok
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多