【问题标题】:Postgresql regexp_replace negative lookahead not workingPostgresql regexp_replace 负前瞻不起作用
【发布时间】:2017-06-30 19:19:29
【问题描述】:

只有当街道后面没有任何字母时,我才尝试用 st 替换街道。如果街道后有非字母字符或字符串结尾,则允许替换。

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

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

这里的street 不应该被st 替换,因为street 后面是'c'。所以预期的输出是“super streetcom”,但我得到的输出是“super stcom”。

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

【问题讨论】:

  • 你确定(?!=pattern) 是postgresql 中正确的否定前瞻语法吗?通常它只是(?!pattern)
  • Ohhh.. 发现我的错误。负前瞻应该是(?!模式)。谢谢@SebastianProske

标签: regex postgresql


【解决方案1】:

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

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

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

online demo

来自docs

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

【讨论】:

    【解决方案2】:

    这看起来像是一个语法问题。尝试:?! 而不是 ?!= 。 例如

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

    会回来

    super st
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 2019-03-30
      • 2018-05-06
      • 2020-06-11
      相关资源
      最近更新 更多