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 に一致し、2 番目の文字列には一致しません。

これは、ABCD_EFGH が一致させたいテキストの前にあり、_ が一致させたいテキストの後にあると想定しても安全です。

助けてくれてありがとう!

編集: これは 10g で動作する必要があります。その明確なターバノフを作成せずに申し訳ありません。

4

1 に答える 1

1

11gでREGEXP_SUBSTRを使用

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 に答える