使用 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"。
如何替换所有出现的 ' 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"。