Это должно работать на примере, который вы использовали:
REGEXP_REPLACE( txt, '(^.*\*.*\*.*\*)([[:alnum:]]*)(\*.*$)', '\2')
Таким образом, SELECT будет:
WITH t
AS (SELECT 'T*76031*12558*test*received percents' AS txt FROM DUAL)
SELECT REGEXP_REPLACE( txt, '(^.*\*.*\*.*\*)([[:alnum:]]*)(\*.*$)', '\2')
FROM t;
Регулярное выражение ищет:
Группа 1:
начало строки. Любое количество символов до ''. Любые дальнейшие символы до другого ''. Любые последующие символы до третьего '*'.
Группа 2:
Любые буквенно-цифровые символы
Группа 3:
«*», За которым следуют любые другие символы до конца строки.
Заменить все вышеперечисленное тем, что было найдено в группе 2.
Надеюсь, это поможет.
EDIT:
В продолжение замечательного ответа Роба ван Вейка из другой ветки здесь:
Извлечение подстроки из заданной строки
WITH t
AS (SELECT 'T*76031*12558*test*received percents' AS txt FROM DUAL)
SELECT REGEXP_SUBSTR( txt,'[^\*]+',1,4)
FROM t;