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