我正在尝试进行正则表达式匹配,以返回起点和终点之间的子字符串。
鉴于下表:
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上工作。很抱歉没有做出那种清晰的头巾。
答案 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