Postgresql regexp_replace 'g' 标志

Postgresql regexp_replace 'g' flag

我有字符串
[[good|12345]] [[bad1 [[bad2 [[bad3 [[bad4 [[bad5 [[good|12345]]

如果后面没有 |,我需要杀死 [[

我做什么: select regexp_replace('[[good|12345]] [[bad1 [[bad2 [[bad3 [[bad4 [[bad5 [[good|12345]]', '\[\[([^\|]+?(\[\[|\Z))', '', 'g')

我得到了什么: [[good|12345]] bad1 [[bad2 bad3 [[bad4 bad5 [[good|12345]]

我想得到什么: [[good|12345]] bad1 bad2 bad3 bad4 bad5 [[good|12345]]

看起来我的正则表达式 [[ 的最后 2 个符号在下一次正则表达式迭代中不存在

您应该使用前瞻而不是组:

select regexp_replace('[[good|12345]] [[bad1 [[bad2 [[bad3 [[bad4 [[bad5 [[good|12345]]', '\[\[([^\|]+?(?=\[\[|\Z))', '', 'g')

demo SQL fiddle

(?=\[\[|\Z)检查 [[ 的存在,但不会消耗字符(即匹配并继续通过字符串)。因此,以下 [[ 仍可用于下一场比赛。