Нет необходимости в регулярных выражениях.Вы можете использовать instr
с th_appearance = -1, чтобы начать с конца
with t as (select 'AB12,AB23,AB50,AB71X,AB43,AB98X,AB11' as input from dual)
select
substr(input,1, instr(input,',', 1)-1) as firstPart,
substr(input,instr(input,',', 1)+1, instr(input,',', 1, 1)-1) as secondPart,
substr(substr(input,1, instr(input,'X,', -1)-1), instr(substr(input,1, instr(input,'X,', -1)), ',', -1)+1) as thirdPart
from t;
Возвращает:
AB12 AB23 AB98
Или объединено:
with t as (select 'AB12,AB23,AB50,AB71X,AB43,AB98X,AB11' as input from dual)
select
substr(input,1, instr(input,',', 1)-1) || ',' ||
substr(input,instr(input,',', 1)+1, instr(input,',', 1, 1)-1) || ',' ||
substr(substr(input,1, instr(input,'X,', -1)-1), instr(substr(input,1, instr(input,'X,', -1)), ',', -1)+1) as output
from t;
Возвращает:
AB12,AB23,AB98