2017-06-30 43 views
2

我試圖用街頭替換街道,只有街道沒有任何字母后面。如果在街道之後有字母字符或字符串結尾,則允許替換。Postgresql regexp_replace負向預測不起作用

我想在Postgresql 9.5 regex_replace函數中實現這個。示例查詢我寫道:這裏

select regexp_replace('super streetcom','street(?!=[a-z])','st');

街道不應該被替換ST,因爲街道後面是「C」。所以預期的輸出是'超級街道',但我得到的輸出是'超級stcom'。

任何幫助爲什麼我得到意想不到的輸出和什麼可以是正確的方式來實現預期的結果。

+1

你確定'(?!= pattern)'是postgresql中正確的負向超前語法嗎? Usualy它只是'(?!模式)' –

+0

哦..發現我的錯誤。負面看起來應該是(?!模式)。謝謝@SebastianProske – Bhindi

回答

1

一個lookahead construct看起來像(?!...),所有接下來?!是一個超前的圖案,該引擎將嘗試匹配,一旦找到了,比賽將失敗。

看來你需要匹配整個單詞street。使用\y,一個字邊界:

select regexp_replace('super streetcom street','\ystreet\y','st'); 

online demo

enter image description here

docs

\y比賽只有一個單詞的開頭或結尾

1

這看起來像一個語法問題。試試:?!而不是?!=。 例如

select regexp_replace('super street','street(?![a-z])','st'); 

將返回

super st