我在TEXT类型的PostgreSQL列中有数据,我需要对其进行一些字符替换。具体来说,我想用花括号代替方括号。要注意的是,如果您包括主包围支架,那么我只想替换不超过两层的支架。这些字符串可能很长,所以我认为正则表达式可能是可行的(regexp_replace
函数),但对正则表达式而言我并不擅长。这是一个这样的值的示例:
[0,0,0,[12,2],0,0,[12,[1,2,3]],12,0,[12,2,[2]],12,0,12,0,0]
因此,我希望此字符串更改为:
{0,0,0,{12,2},0,0,{12,[1,2,3]},12,0,{12,2,[2]},12,0,12,0,0}
提前致谢!
对于Regex而言,这将是一件痛苦的事情,因为在PostgreSQL风格中,可能没有递归可用。
对于最大2级嵌套深度的检查,如果双替换为以下作品(不能测试它)
regexp_replace(
regexp_replace('str', E'\\[(([^][]|\\[([^][]|\\[[^][]*\\])*\\])*)\\]', E'{\\1}', 'g')
, E'\\[(([^][]|\\[([^][]|\\[[^][]*\\])*\\])*)\\]', E'{\\1}', 'g')
想法是在两遍[]
中匹配并替换最外层。请参阅regex101上的示例:
通过1:{0,0,0,[12,2],0,0,[12,[1,2,3]],12,0,[12,2,[2]],12,0,12,0,0}
通过2:{0,0,0,{12,2},0,0,{12,[1,2,3]},12,0,{12,2,[2]},12,0,12,0,0}
\[[^][]*\]
(未转义)匹配的一个实例 [...]
\[
开口方括号[^][]*
后跟任意数量的字符,没有方括号\]
紧接着是一个方括号注意的是,如果在字符串总是开头[
,有端]
和表示级0中的一个实例(不通过被分隔][
)第一/内regexp_replace
也可以通过替换来完成[
在^
开始和]
在$
端:E'^\\[(.*)\\]$'
与E'{\\1}'
要在此处添加嵌套的示例,其最大深度为4级:
\[([^][]| # outer
\[([^][]| # lvl 1
\[([^][]| # lvl 2
\[([^][]| # lvl 3
\[[^][]*\] # lvl 4
)*\]
)*\]
)*\]
)*\]
将外部内部的内容包装[]
到捕获组中,四个级别的模式将变为:
\[(([^][]|\[([^][]|\[([^][]|\[([^][]|\[[^][]*\])*\])*\])*\])*)\]
需要使用时regex_replace
可能需要额外的转义[]
\\[(([^][]|\\[([^][]|\\[([^][]|\\[([^][]|\\[[^][]*\\])*\\])*\\])*\\])*)\\]
可以像两次通过中的第一个模式一样使用它,并替换为 E'{\\1}'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句