这将是一个痛苦与正则表达式为in PostgreSQL flavor possibly no recursion is available。
对于最多2级的嵌套深度检查时,如果下面的双替换工作(不能测试它)
regexp_replace(
regexp_replace('str', E'\\[(([^][]|\\[([^][]|\\[[^][]*\\])*\\])*)\\]', E'{\\1}', 'g')
, E'\\[(([^][]|\\[([^][]|\\[[^][]*\\])*\\])*)\\]', E'{\\1}', 'g')
的想法是匹配并在两次通过更换最外[]
。 参见在regex101例如:
pass 1:{0,0,0,[12,2],0,0,[12,[1,2,3]],12,0,[12,2,[2]],12,0,12,0,0}
pass 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
)*\]
)*\]
)*\]
)*\]
结束语什么是外[]
内部分成capture group为4个级别的模式将成为:
\[(([^][]|\[([^][]|\[([^][]|\[([^][]|\[[^][]*\])*\])*\])*\])*)\]
为使用regex_replace
需要额外逃脱[]
\\[(([^][]|\\[([^][]|\\[([^][]|\\[([^][]|\\[[^][]*\\])*\\])*\\])*\\])*)\\]
这可以像t在两次传球,他的第一图案和用E'{\\1}'
哇,谢谢你的详细解决方案。我需要一点时间来评估这些。不过,我会提到,表现是一个很重要的考虑因素。我已经创建了自己的plpgsql解决方案,但对于包含超过1000万个字符的列,使用position()和substr()方法太慢,正如我的情况。对不起,我没有在我的第一篇文章中提到@wildplasser。 – 2014-09-27 22:12:16
我会进一步提到,我已经开始使用plpythonu解决方案,但目前尚未安装语言扩展,并且尝试安装它时出现错误。我可能不得不咬紧牙关,弄清楚。 – 2014-09-27 22:37:27