使用正则表达式Oracle

时间:2013-11-13 18:19:24

标签: sql regex oracle

我希望使用正则表达式来捕获字符串中的最后一个值。我复制了一个我要解析的数据示例。我正在使用oracle语法。

示例数据:

||CULTURE|D0799|D0799HTT|
||CULTURE|D0799|D0799HTT||

我希望删除最后一组管道之前的最后一个值:

D0799HQTT 
D0799HQTT

我能够创建一个返回CULTURE的regexp_substr:

REGEXP_SUBSTR(c.field_name, '|[^|]+|')

但我无法弄清楚如何从最后开始寻找一个或两个管道,并返回我正在寻找的值。如果您需要更多信息,请与我们联系。

4 个答案:

答案 0 :(得分:3)

你可以试试这个:

select rtrim(regexp_substr('||CULTURE|D0799|D0799HTT||', 
                     '[[:alnum:]]+\|+$'), '|')
from dual;

或者像这样:

select regexp_replace('||CULTURE|D0799|D0799HTT||', 
                     '(^|.*\|)([[:alnum:]]+)\|+$', '\2')
from dual;

Here is a sqlfiddle demo

答案 1 :(得分:2)

最好拔出所有非管道的字符,而不是假设它们适合特定的字符集:

select regexp_replace(regexp_substr('||CULTURE SUBS|INTERNATIONAL TESTING S.A.|ISLAND TEST_PEACE|', '[^|]+\|+$'), '\|', '') from dual;

答案 2 :(得分:1)

考虑以下Regex ......

(?<=\|)[\w\d]*?(?=\|*$)

祝你好运!

答案 3 :(得分:0)

SELECT  REPLACE
        (
            REGEXP_SUBSTR(str, '\w+\W{0,}$')
        ,   '|'
        ) AS result
FROM
(
        SELECT  '||CULTURE|D0799|D0799HTT|'  AS str FROM DUAL UNION ALL
        SELECT  '||CULTURE|D0799|D0799HTT||' AS str FROM DUAL
)
;