【问题标题】:Using regexp_replace how do t replace a string with an exception使用 regexp_replace 如何用异常替换字符串
【发布时间】:2018-11-23 08:19:43
【问题描述】:

如何将所有出现的' sub.*' 替换为' substation.*' 除外?

regexp_replace("CleanString",' sub.*',' ', 'ig')

我尝试过使用各种分组组合 () 但仍然没有得到它。

使用 postgres regexp_replace()

【问题讨论】:

  • 你能修正一下语法吗?这个问题本来就难以理解。
  • @LaurenzAlbe 这对我来说似乎很清楚,但我还是把它整理好了。

标签: postgresql regexp-replace


【解决方案1】:

正则表达式通常只匹配存在的内容,而不匹配不存在的内容 - 您不能简单地在其中放置“if-then-else”。

不过,Postgres 的正则表达式支持 the manual page for which is here 包括“lookahead”和“lookbehind”表达式。

在你的情况下,你想要一个 *negative lookahead":

(?!re) 否定前瞻匹配在没有子字符串匹配重新开始的任何点(仅限 ARE)

重要的是要注意短语“在任何点” - 环视是“零宽度”,所以(?!station) 并不意味着“station 以外的东西”,它的意思是“在字符串中的位置@987654325 @ 不会是下一个”。

因此,您可以这样构建查询:

' sub(?!station).*'

这将匹配“sub”、“foo sub”、“subbar”或“foo subbar”中的任何一个,但不匹配“substation”、“foo substation”、“substationbar”或“foo substationbar”中的任何一个。由于(?!station) 是零宽度,而下一个标记是.*,所以“sub”之后什么都没有。

如果您希望在“sub”之后有 something,您可以改为:

' sub(?!station).+'

.+ 表示“至少其中一个”,因此它仍将匹配“subbar”和“foo subbar”,但不再匹配“sub”或“foo sub”。

【讨论】:

  • 很好的解释和建议。完美运行!感谢 IMSoP
猜你喜欢
  • 2015-09-11
  • 2014-11-17
  • 1970-01-01
  • 2021-12-29
  • 2012-09-25
  • 2014-10-23
  • 2015-03-12
  • 2017-01-11
  • 1970-01-01
相关资源
最近更新 更多