我有这样的字符串: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'
标志,但结果相同。
如何正确地做到这一点?
答案 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')