Rifando este método para dividir uma string enquanto permite nulos:
select regexp_substr('A~^B~^C~D^E','(.*?)(~\^|$)', 1, level, null, 1) from dual
connect by level < regexp_count('A~^B~^C~D^E','(.*?)(~\^|$)');
REGEXP_SUBS
-----------
A
B
C~D^E
Como na resposta vinculada, ele procura por quaisquer caracteres, não gananciosamente, seguidos pela combinação de
~^
(com o acento circunflexo escapado, então ~\^
) ou fim de linha. O regexp_substr()
as chamadas também usam os argumentos opcionais para especificar subexpr
- para que ele receba apenas o primeiro agrupamento (.*?
) e não o próprio delimitador, que está no segundo agrupamento. Se você deseja um elemento específico, isso está ainda mais próximo do post vinculado:
select regexp_substr('A~^B~^C~D^E','(.*?)(~\^|$)', 1, 3, null, 1) from dual;
REGEX
-----
C~D^E
Ou como você está fazendo isso em um procedimento, use a consulta connect-by para preencher uma coleção e, em seguida, escolha o elemento que você precisa, se você estiver olhando para mais de um.