使用 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 替换代码的某些部分