如何使用 Postgres 正则表达式替换捕获组

How to use Postgres Regex Replace with a capture group

正如上面的标题所示,我正在尝试为 postgres 查询中的正则表达式替换引用捕获组。我读到 regex_replace 不支持使用正则表达式捕获组。我使用的正则表达式是

r"(?:[\s\(\)\=\)\,])(username)(?:[\s\(\)\=\)\,])?"gm

上面的正则表达式几乎可以满足我的需要,但我需要了解如何仅在捕获组也捕获某些内容时才允许匹配。如果“用户名”恰好是单词的子串,则不存在应该匹配的情况。通过确保它被上述之一包围,我可以更有信心地确保它是一个用户名。

正则表达式的一个示例应用程序在 postgres 中是这样的(当然我会做一个更新 vs select):

select *, REGEXP_REPLACE(reqcontent,'(?:[\s\(\)\=\)\,])(username)(?:[\s\(\)\=\)\,])?' ,'NEW-VALUE', 'gm') from table where column like '%username%' limit 100;

如果可以提供更多上下文,请告诉我。我也找到了类似的帖子 (),但它更多地讨论了重新拼接值,我认为并不能完全回答我的问题。

正则表达式的更多上下文和示例值。下面的文字可能看起来很熟悉,这些是 Jira 中的 JQL 过滤器。我们希望更新我们的用户名及其在包含过滤器的 table 中的所有出现。下面是几个过滤器的例子。我们最初只是在做一个查找替换,但这不起作用,因为我们有一些只有两个字符的用户名,并且它匹配非用户名(例如 je(用户名)会在找到项目的地方放置一个新值这完全扭曲了 JQL/String 导致类似 proNEW-VALUEct = balh blah)

type = bug AND status not in (Closed, Executed) AND assignee in (test, username)

assignee=username

assignee = username

回答的定义:

捕获组用于保持重要的信息位与正则表达式相匹配。

在要保留在结果中的字符串部分周围使用捕获组,并在替换中使用它们的占位符:

REGEXP_REPLACE(reqcontent,'([\s\(\)\=\)\,])username([\s\(\)\=\)\,])?' ,'NEW-VALUE', 'gm')

或使用环视:

REGEXP_REPLACE(reqcontent,'(?<=[\s\(\)\=\)\,])(username)(?=[\s\(\)\=\)\,])?' ,'NEW-VALUE', 'gm')

或者,在这种情况下,使用单词边界来确保您仅在特殊字符内替换单词:

REGEXP_REPLACE(reqcontent,'\yusername\y' ,'NEW-VALUE', 'g')