使用正则表达式 Oracle

Posted

技术标签:

【中文标题】使用正则表达式 Oracle【英文标题】:Using Regular Expression Oracle 【发布时间】:2013-11-13 18:19:24 【问题描述】:

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

示例数据:

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

我希望去掉最后一组管道之前的最后一个值:

D0799HQTT 
D0799HQTT

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

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

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

【问题讨论】:

您是否尝试过拆分字符串并拾取最后一个非空元素? 像这样:array = str.split('|'); int i = array.length; while(array[i].isEmpty()) i--; array[i] = yourLastValue;希望它清楚我写的内容。 ;) @KamilW。这如何回答这个问题(在 Oracle 中使用正则表达式拆分字符串)? @FrankSchmitt 谢谢你的好问题。我的想法是,也许作者会在这个例子中使用它:sqltutorials.blogspot.com/2007/09/sql-function-split.html 这只是一个快速响应。干杯 【参考方案1】:

你可以试试这个:

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

【讨论】:

也许这对于“||CULTURE SUBS|INTERNATIONAL TESTING S.A.|ISLAND TEST_PEACE|”更容易我想返回“ISLAND TEST_PEACE”。您对如何考虑空格和特殊字符有什么建议吗? 使用你自己的类代替[[:alnum:]],即[a-zA-Z0-9 _] 啊很好!非常感谢,您帮助了解了更多关于正则表达式的知识。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

考虑以下正则表达式...

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

祝你好运!

【讨论】:

你确定Oracle支持前瞻吗?【参考方案4】:
SELECT  REPLACE
        (
            REGEXP_SUBSTR(str, '\w+\W0,$')
        ,   '|'
        ) AS result
FROM
(
        SELECT  '||CULTURE|D0799|D0799HTT|'  AS str FROM DUAL UNION ALL
        SELECT  '||CULTURE|D0799|D0799HTT||' AS str FROM DUAL
)
;

【讨论】:

以上是关于使用正则表达式 Oracle的主要内容,如果未能解决你的问题,请参考以下文章

Oracle正则表达式

oracle SQL 正则表达式

2015.3.20 Oracle使用正则表达式

如何利用oracle正则表达式去除字段中含有的汉字

Oracle正则表达式-初级

oracle 正则表达式如何提取AABAAB类型的数据?