regexp_replace替换文本中的每一部分

时间:2016-05-07 11:19:31

标签: sql regex postgresql

我有这样的字符串:aa/ss/[img]aa/ss/dd[/img][img]aa/ss/dd[/img]aa/ss

我需要将此/ss/替换为/WW/,但仅限于[img]个标记之间。结果必须是:

aa/ss/[img]aa/WW/dd[/img][img]aa/WW/dd[/img]aa/ss

我正在尝试这个:

select regexp_replace('aa/ss/[img]aa/ss/dd[/img][img]aa/ss/dd[/img]aa/ss', '(\[img\].*/)ss(/.*\[\/img\])', '\1WW\2', 'g')

但这只取代了一件,而不是两件。我使用'g'标志,但结果相同。

如何正确地做到这一点?

1 个答案:

答案 0 :(得分:2)

问题在于运营商的“贪婪”。您有重复的表达式,因此ss可以匹配模式一次或两次 - 具体取决于中间'[/img][img]是否计为与.*或固定模式的匹配。

不幸的是,我更容易诊断问题而不是解决问题 - 我发现正则表达式中的贪婪只是令人困惑。但是,这是您的特定字符串的修复程序。它只需考虑'['字符:

select regexp_replace('aa/ss/[img]aa/ss/dd[/img][img]aa/ss/dd[/img]aa/ss',
                      '(\[img\][^[]*/)ss(/[^[]*\[\/img\])',
                      '\1WW\2',
                      'g')