oracle正则匹配全部,sql – 返回Oracle中正则表达式的所有匹配项

您已经提供了数据样本,说明这是一行,但已将其显示为两个不同的行.所以这个例子基于你的话.

-- 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

结果:

ID RES

---------------------------------------------------------

1 {CUSTOMERS1.CUST_ADDR1}{CUSTOMERS1.CUST_NAME}

2 {CUSTOMERS2.CUST_ADDR2}{CUSTOMERS2.CUST_NAME}

根据问题的@a_horse_with_no_name comment,实际上,更换其他与模式不匹配的内容要简单得多.这是一个例子:

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

结果:

RES

-------------------------------------------

{CUSTOMERS.CUST_NAME}{CUSTOMERS.CUST_ADDR1}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值