使用 regexp_replace 如何用异常替换字符串

Using regexp_replace how do t replace a string with an exception

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

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

我试过使用各种分组组合 () 但还是没搞定。

使用 postgres regexp_replace()

正则表达式通常只匹配存在的东西,不匹配不存在的东西——你不能简单地在里面放一个 "if-then-else"。

但是,Postgres 的正则表达式支持 the manual page for which is here 包括 "lookahead" 和 "lookbehind" 表达式。

在你的情况下,你想要一个*负面的前瞻性":

(?!re) negative lookahead matches at any point where no substring matching re begins (AREs only)

请务必注意短语 "at any point" - 环视是 "zero width",因此 (?!station) 并不意味着 "something other than station",而是 "a position in the string where station isn't coming next"。

因此,您可以像这样构造您的查询:

' sub(?!station).*'

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

如果你想在 "sub" 之后有 东西 ,你可以改为写:

' sub(?!station).+'

.+表示"at least one of something",所以它仍然匹配“subbar”和"foo subbar",但不再匹配“sub”或"foo sub"。