2017-06-30 98 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