2015-08-25 2 views
2

У меня есть строка
[[good|12345]] [[bad1 [[bad2 [[bad3 [[bad4 [[bad5 [[good|12345]]PostGreSQL regexp_replace 'г' флаг

мне нужно убить [[ если слово нету | после него.

, что я делаю: select regexp_replace('[[good|12345]] [[bad1 [[bad2 [[bad3 [[bad4 [[bad5 [[good|12345]]', '\[\[([^\|]+?(\[\[|\Z))', '\1', 'g')

, что я получаю: [[good|12345]] bad1 [[bad2 bad3 [[bad4 bad5 [[good|12345]]

, что я хочу получить: [[good|12345]] bad1 bad2 bad3 bad4 bad5 [[good|12345]]

это выглядит как последние 2 символа моего регулярного выражения [[ не делает существует в следующей итерации regexp

ответ

0

Вы должны использовать прогноз вместо группы:

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

См demo SQL fiddle

enter image description here

(?=\[\[|\Z) прогнозных только проверки присутствие [[, но не потребляет символ (т.е. соответствует и перемещается по строке). Таким образом, следующие [[ остаются доступными для следующего матча.

+0

Спасибо за ответ ур, должен ли я установить '? =' Каждому члену группы? Будет ли разница между '(? = A | b)' и '(? = A |? = B)' –

+0

Отрицательный lookahead '(? = \ [\ [| \ Z)' проверяет, есть ли [[[ 'или конец строки. Если вы напишете '(? = A |? = B)', вы получите ошибку, так как переменный оператор '|' не может быть количественно определен (не может быть 1 или более операций чередования в 1 единственном месте в строке). Если вы пишете '(? = A) (? = B)' выражение никогда не будет соответствовать 1, и тот же символ в данной позиции не может быть 'a' и' b' в одно и то же время (обратные действия выполняют проверку без потребления текст, они делают это, все еще находясь в том же месте, где вступает в игру. –

+1

спасибо человеку, это помогает –

Смежные вопросы