Because I used single characters as example in my question, but in practicality I'm using long strings in my project, for example 'How~do~I~do~this'
I came across this solution from OTN Oracle.com, thanks to chris227.
SELECT CAST(REGEXP_SUBSTR (str, '(.*?)(~|$)', 1, level, null, 1) AS CHAR(12)) output
FROM (select 'How~do~I~do~this' as str from dual)
CONNECT BY level <= regexp_count(str, '~') + 1;
This will work even with single characters.
Hope this will help others looking for similair solutions.