You are getting only one match since the functions you used (split_part,regexp_substr) returns the n'th element of the match.
The most naive approach to solve this:
select regexp_substr(split_part('ABC1,ABC2,WWW1,WWW2,ABC3,WWW3,WWW4,ABC4',',',1),'ABC[^"]*')
union all
select regexp_substr(split_part('ABC1,ABC2,WWW1,WWW2,ABC3,WWW3,WWW4,ABC4',',',2),'ABC[^"]*')
union all
...
select regexp_substr(split_part('ABC1,ABC2,WWW1,WWW2,ABC3,WWW3,WWW4,ABC4',',',20),'ABC[^"]*')
To improve this, you would need to first transform the comma delimited value to multiple rows, and then using the regex. This can be done in various ways, see this post for more details.
Result:
ABC1
ABC2
The tricky part here, is the absence os a table-generating function to split the comma delimited value to multiple rows.
split_partandregexp_substrreturn on the n`th occurrence of the match. Not all matches. To get what you want you need to CROSS JOIN with a table containing the numbers 1..100 (or whatever the maximum number of words you need to extract) and apply the functions to each index effectively turning the list into multiple rows. Then select the rows you need. See here for an example.