regexp_substr działa w ten sposób:
Jeśli wystąpienie jest większe niż 1, baza danych wyszukuje drugie wystąpienie, zaczynając od pierwszego znaku następującego po pierwszym wystąpieniu wzorca , i tak dalej. To zachowanie różni się od funkcji SUBSTR, która rozpoczyna wyszukiwanie drugiego wystąpienia od drugiego znaku pierwszego wystąpienia.
Tak więc wzorzec [^|] będzie szukał potoków NON, co oznacza, że pominie kolejne potoki („||”), szukając znaku niebędącego potokiem.
Możesz spróbować:
select trim(regexp_substr(replace('A|test||string', '|', '| '), '[^|]+', 1, 4)) from dual;
Zastąpi to „|” z "| " i pozwala na dopasowanie na podstawie wzorca [^|]