这将是一个痛苦的事情,如果在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级的示例:
\[([^][]|
\[([^][]|
\[([^][]|
\[([^][]|
\[[^][]*\]
)*\]
)*\]
)*\]
)*\]
将外部的[]
中的内容包装到捕获组中,4级模式的模式将变为:
\[(([^][]|\[([^][]|\[([^][]|\[([^][]|\[[^][]*\])*\])*\])*\])*)\]
如果要与 regex_replace
一起使用,则可能需要对 []
进行额外的转义。
\\[(([^][]|\\[([^][]|\\[([^][]|\\[([^][]|\\[[^][]*\\])*\\])*\\])*\\])*)\\]
这可以像第一种模式一样在两个步骤中使用,并替换为E'{\\1}'