La regexp_substr fonctionne comme suit :
Si l'occurrence est supérieure à 1, alors la base de données recherche la deuxième occurrence en commençant par le premier caractère suivant la première occurrence du modèle , et ainsi de suite. Ce comportement est différent de la fonction SUBSTR qui commence sa recherche de la deuxième occurrence au deuxième caractère de la première occurrence.
Ainsi, le motif [^|] recherchera les canaux NON, ce qui signifie qu'il ignorera les canaux consécutifs ("||") à la recherche d'un caractère non-canal.
Vous pouvez essayer :
select trim(regexp_substr(replace('A|test||string', '|', '| '), '[^|]+', 1, 4)) from dual;
Cela remplacera un "|" avec un "| " et vous permettent de faire correspondre en fonction du modèle [^|]