You provided a sample of data saying that it is one line, but presented it as two different lines. So this example is based on your words.
-- Sample of data from your question + extra row for the sake of demonstration -- id column is added to distinguish the rows(I assume you have one) with t1(id, col) as( select 1, '^FO360,065^AEN,25,10^FD{CUSTOMERS1.CUST_NAME}^FS^FO360,095^AAN,15,12^FD{CUSTOMERS1.CUST_ADDR1}^FS' from dual union all select 2, '^FO360,065^AEN,25,10^FD{CUSTOMERS2.CUST_NAME}^FS^FO360,095^AAN,15,12^FD{CUSTOMERS2.CUST_ADDR2}^FS' from dual ), cnt(c) as( select level from (select max(regexp_count(col, '{\w+.\w+}')) as o_c from t1 ) z connect by level <= z.o_c ) select t1.id, listagg(regexp_substr(t1.col, '{\w+.\w+}', 1, cnt.c)) within group(order by t1.id) res from t1 cross join cnt group by t1.id
Result:
ID RES --------------------------------------------------------- 1 {CUSTOMERS1.CUST_ADDR1}{CUSTOMERS1.CUST_NAME} 2 {CUSTOMERS2.CUST_ADDR2}{CUSTOMERS2.CUST_NAME}
According to @a_horse_with_no_name, commenting on a question is indeed much simpler than just replacing everything else that doesn't match the pattern. Here is an example:
with t1(col) as( select '^FO360,065^AEN,25,10^FD{CUSTOMERS.CUST_NAME}^FS^FO360,095^AAN,15,12^FD{CUSTOMERS.CUST_ADDR1}^FS' from dual ) select regexp_replace(t1.col, '({\w+.\w+})|.', '\1') res from t1
Result:
RES ------------------------------------------- {CUSTOMERS.CUST_NAME}{CUSTOMERS.CUST_ADDR1}