2016-05-07 2 views
1

У меня есть строка, как это: aa/ss/[img]aa/ss/dd[/img][img]aa/ss/dd[/img]aa/ssREGEXP_REPLACE заменить каждую часть в тексте

Мне нужно заменить этот кусок /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' флаг buth такой же результат.

Как это сделать правильно?

+0

HTML и регулярные выражения ... http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained- теги/1732454 # 1732454 –

ответ

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')