0

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

给定下表:

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 上工作。很抱歉没有把头巾弄得那么清楚。

4

1 回答 1

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
于 2012-06-06T05:34:16.373 回答