2015-08-25 75 views
2

我有串
[[good|12345]] [[bad1 [[bad2 [[bad3 [[bad4 [[bad5 [[good|12345]]PostgreSQL的REGEXP_REPLACE 'G' 標誌

我需要殺死[[如果字後還沒有|

我做什麼: 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個符號[[不存在於正則表達式的下一次迭代

回答

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

感謝烏爾答案,我應該設置'?='到組的每個成員?這將是之間'差(=一個?| B)'和'(= A |?= b)個' –

+0

負先行'(= \ [\ [|?\ Z)'檢查是否存在'[[ '或者行尾。如果你寫的'(= A |??= B)',你會得到,因爲交替操作錯誤'|'不​​能量化的(有可能在串1個單位置沒有1個或多個交替操作)。如果寫'(?= A)(?= B)'表達永遠不會匹配爲1,在給定位置相同的字符不能同時'A'和'B'(lookarounds而不消耗執行檢查文字,他們這樣做,同時仍住在同一地方,環視發揮了作用。 –

+1

感謝的人,它可以幫助 –