Oracle正则表达式返回特定开始和结束字符串之间的子字符串

时间:2012-06-06 04:42:11

标签: regex oracle

我正在尝试进行正则表达式匹配,以返回起点和终点之间的子字符串。

鉴于下表:

WITH test AS (SELECT 'ABCD_EFGH_THIS_IJKL' AS thetext FROM DUAL
UNION SELECT 'ABAB CDCD EG BCD' FROM DUAL)
SELECT *
FROM test

我想要返回结果:

'THIS'
NULL

所以它会匹配第一个字符串中的THIS,而第二个字符串中没有任何内容。

为此可以安全地假设ABCD_EFGH位于我想要匹配的文本之前,并且_跟随我想要匹配的文本。

感谢您的帮助!

编辑:这需要在10g上工作。很抱歉没有做出那种清晰的头巾。

1 个答案:

答案 0 :(得分:1)

使用REGEXP_SUBSTR和11g

WITH test AS (SELECT 'ABCD_EFGH_THIS_IJKL' AS thetext FROM DUAL
UNION SELECT 'ABAB CDCD EG BCD' FROM DUAL)
SELECT REGEXP_SUBSTR( TEST.THETEXT, 'ABCD_EFGH_([^_]*).*', 1, 1, 'i', 1)
FROM test

修改

这可以在不使用正则表达式的情况下完成。

WITH test AS (SELECT 'ABCD_EFGH_THIS_IJKL' AS thetext FROM DUAL
UNION SELECT 'ABAB CDCD EG BCD' FROM DUAL)
select TEST.thetext
     , instr(TEST.thetext, 'ABCD_EFGH_') + length('ABCD_EFGH_')  START_POS
     , instr(TEST.thetext, '_', length('ABCD_EFGH_') + 1) END_POS
     , substr
            (TEST.thetext
            ,instr(TEST.thetext, 'ABCD_EFGH_') + length('ABCD_EFGH_') --START_POS
            ,instr(TEST.thetext, '_', length('ABCD_EFGH_') + 1) - (instr(TEST.thetext, 'ABCD_EFGH_') + length('ABCD_EFGH_')) --END_POS - START_POS
            ) RESULT
FROM test