Я считаю, что это то, что вы ищете. Регулярное выражение использует группу захвата, чтобы «запомнить», что находится между текстом привязки, и вернуть его.
SQL> with tbl(str) as (
select 'Group Title: Goal Setting Duration: 60 minutes' from dual union all
select 'Group Title: Mood Management Duration: 90 minutes' from dual
)
select regexp_substr(str, 'Group Title:\s(.*?)\sDuration.*', 1, 1, NULL, 1) "GROUP TITLE",
regexp_substr(str, '.*Duration:\s(.*?)( |$)', 1, 1, NULL, 1) "DURATION"
from tbl;
GROUP TITLE DURATION
----------------- -----------------
Goal Setting 60 minutes
Mood Management 90 minutes
SQL>
РЕДАКТИРОВАТЬ Эти регулярные выражения ограничивают двоеточие только в случае изменения заголовков:
select regexp_substr(str, '.*:\s(.*?)\s.*:.*', 1, 1, NULL, 1) "GROUP TITLE",
regexp_substr(str, '.*:\s(.*?)( |$)', 1, 1, NULL, 1) "DURATION"
from tbl;
ВНОВЬ РЕДАКТИРОВАТЬ Переходя к следующему шагу, если вы считаете, что это действительно просто строка с разделителями, а разделитель - пробел-слово-двоеточие-пробел, захватывайте и возвращайте 2-ю и 3-ю группы символов, за которыми следует пробел-слово-двоеточие или конец строки.
select regexp_substr(str, '(.*?)( \w+: |$)', 1, 2, NULL, 1) "GROUP TITLE",
regexp_substr(str, '(.*?)( \w+: |$)', 1, 3, NULL, 1) "DURATION"
from tbl;