【问题标题】:Oracle Look behind Positive甲骨文看正面
【发布时间】:2015-11-28 07:58:36
【问题描述】:

Oracle Doc 中没有后向表达式的例子,所以我尝试使用 Java 语法, 这是我的查询应该在TOP之后得到任何数字

select regexp_substr('TIPTOP4152','(?<=TOP)\d+') sub from dual

但是什么都不能显示!

【问题讨论】:

    标签: sql regex oracle


    【解决方案1】:

    我不确定Oracle 是否支持lookbehind。相反,您应该可以使用 regexp_replace

    轻松完成此操作
    REGEXP_REPLACE('TIPTOP4152', '.*TOP(\d+)', '\1')
    

    【讨论】:

    • 不错,但如果存在,它会给出数字和数字之后的任何内容,试试TIPTOP4152.csv => 4152.csv
    【解决方案2】:

    为了争论,REGEXP_SUBSTR 也可以:

    SQL> select regexp_substr('TIPTOP4152', 'TOP(\d+)', 1, 1, NULL, 1) nbr
        from dual;
    
    NBR
    ----
    4152
    
    SQL>
    

    【讨论】:

    • 最终参数'1',获取第一个捕获组。 Oracle 11g docs on REGEXP_INSTR: 如果 subexpr 为零,则返回与模式匹配的整个子字符串的位置。如果 subexpr 大于零,则返回匹配子字符串中子表达式编号 subexpr 对应的子字符串片段的位置。如果 pattern 至少没有 subexpr 子表达式,则函数返回零。空 subexpr 值返回 NULL。 subexpr 的默认值为零。
    • 即,正向后视似乎在 Oracle 中不起作用,请改用此解决方案中的“技巧”来捕获组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2011-07-19
    • 2014-09-11
    • 2011-06-15
    • 2020-06-10
    相关资源
    最近更新 更多