Here are a couple of ways you could do it:
WITH sample_data AS (SELECT 'a, b, c, d' str FROM dual UNION ALL
SELECT 'e, f, g, h, i, j' str FROM dual UNION ALL
SELECT 'e, f, g, h, i, jk' str FROM dual UNION ALL
SELECT 'e,f,g,h,i,jk' str FROM dual UNION ALL
SELECT 'e,f,g,h,i,' str FROM dual UNION ALL
SELECT 'e, f, g, h, i,' str FROM dual)
SELECT str,
ltrim(SUBSTR(str, INSTR(str, ',', -1, 1) + 1)) last_item1,
regexp_substr(str, '.*, ?([^,]*$)', 1, 1, NULL, 1) last_item3
FROM sample_data;
STR LAST_ITEM1 LAST_ITEM3
----------------- ----------------- -----------------
a, b, c, d d d
e, f, g, h, i, j j j
e, f, g, h, i, jk jk jk
e,f,g,h,i,jk jk jk
e,f,g,h,i,
e, f, g, h, i,
It's a toss-up between both options as to which one will be most performant and/or maintainable in your system - you'd need to test this.
The regexp_substr solution above checks for a patter of any character (except a newline), followed by a comma, followed by a space (or not) and then finally any character that's not a comma up to the end of the string. Then we output the 1st subexpression (which is defined by bracketing part of the pattern).
I included the ltrim in the substr/instr item since you said your delimiter was a comma, but it looked like maybe it was a comma+space.