PostgreSQL9.4.26/MySQL8.0中,将一个字符串中符合正则匹配的所有子字符串,进一步实现替换:递归+正则

目录

1、需求

 2、解法

3、以此类推,还可以将每行单引号之间的内容替换掉


1、需求

        有如下的多行字符串示例,如何将其中--开头的行中的英文分号匹配为别的字符,但是非--开头的行中,不动

--aaa;bbb;ccc;ddd

aaa;bbb;ccc;ddd

         预计结果为:

--aaa&bbb&ccc&ddd

aaa;bbb;ccc;ddd

 2、解法

 PostgreSQL解法:递归+正则表达式

with recursive q1 as (

select CONCAT('--aaa;bbb;ccc;ddd','\n','aaa;bbb;ccc;ddd') a,5 b

union all

select regexp_replace(a,'(--[^\n]*?);([^;]*?\n)','\1&\2','ig') a,b-1 as b
from q1
where b>=0
)
select * from q1

 MySQL8.0解法:递归+正则表达式

with recursive q1 as (

select CONCAT('--aaa;bbb;ccc;ddd','\n','aaa;bbb;ccc;ddd') a,5 as b  

union all

select regexp_replace(a,'(--[^\n]*?);([^;]*?\n)','$1%$2')  a,b-1 b  
from q1
where b>=0
)
select * from q1

 二者语法基本一样,但是使用捕获组的语法不一样,一个是/1/2,另一个是$1$2

3、以此类推,还可以将每行单引号之间的内容替换掉

'aa;a'bb;b'cc;c'dd;d
;aaa';bbb';ccc';ddd;;;

预计结果如下:

'aa%a'bb%b'cc%c'dd;d
;aaa'%bbb'%ccc';ddd;;;

MySQL8.0解法:

with recursive q1 as (

select CONCAT("'aa;a'bb;b'cc;c'dd;d",'\n',";aaa';bbb';ccc';ddd;;;") a,5 as b  

union all

select regexp_replace(a,"(\'[^\\n\\r]*?);([^\\n\\r]*?\')",'$1%$2')  a,b-1 b  
from q1
where b>=0
)
select * from q1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值