Riffa bort den här metoden för att dela en sträng samtidigt som det tillåter nollor:
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
Som i det länkade svaret letar det efter alla tecken, icke girigt, följt av kombinationen av ~^
(med raden escaped, så ~\^
) eller i slutet av raden. regexp_substr()
calls använder också de valfria argumenten för att specificera subexpr
- så den får bara den första grupperingen (.*?
) och inte själva avgränsaren, som finns i den andra grupperingen.
Om du vill ha ett specifikt element så är det ännu närmare det länkade inlägget:
select regexp_substr('A~^B~^C~D^E','(.*?)(~\^|$)', 1, 3, null, 1) from dual;
REGEX
-----
C~D^E
Eller när du gör detta i en procedur, använd connect-by-frågan för att fylla i en samling och välj sedan det element du behöver, om du ska titta på mer än ett.