Postgresql regexp_replace否定前瞻不起作用

时间:2017-06-30 11:09:39

标签: regex postgresql

如果街道没有跟随任何字母,我试图用街道替换街道。如果在街道之后存在非字母字符或字符串结尾,则允许替换。

我试图在Postgresql 9.5 regex_replace函数中实现这一点。我写的示例查询:

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

这里的街道不应该被st取代,因为街道后面跟​​着'c'。所以预期的输出是“超级街头通讯”,但我得到的输出是“超级stcom”。

为什么我得到意想不到的输出以及实现预期结果的正确方法的任何帮助。

2 个答案:

答案 0 :(得分:1)

这看起来像语法问题。尝试:?!而不是?!=。 e.g。

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

将返回

super st

答案 1 :(得分:1)

lookahead construct看起来像(?!...)?!之后的所有内容都是引擎尝试匹配的超前模式,一旦找到,匹配就会失败。

您似乎需要匹配整个单词street。使用\y,一个单词边界:

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

请参阅online demo

enter image description here

来自docs

  

\y仅匹配单词的开头或结尾