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

Posted

技术标签:

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

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

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

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

使用 postgres regexp_replace()

【问题讨论】:

你能修正一下语法吗?这个问题本来就难以理解。 @LaurenzAlbe 这对我来说似乎很清楚,但我还是把它整理好了。 【参考方案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

以上是关于使用 regexp_replace 如何用异常替换字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何用空白页替换 Spring Boot 的“Whitelabel Error Page”?

如何使用 REGEXP_REPLACE 替换特定条件下的重复单词?

使用 oracle regexp_replace 替换代码的某些部分

oracle 使用 REGEXP_REPLACE 函数替换子字符

REGEXP_REPLACE 用相同的小写文本替换文本

如何使用 REGEXP_REPLACE 检查字符串中是不是存在值“已关闭”并替换