PostgreSQL regexp_替换为匹配的表达式

PostgreSQL regexp_替换为匹配的表达式,postgresql,plpgsql,Postgresql,Plpgsql,我正在使用PostgreSQLregexp\u replace函数对字符串中的方括号、圆括号和反斜杠进行转义,以便我可以将该字符串本身用作正则表达式模式(在使用该字符串之前,还对该字符串进行了其他操作,但这些操作超出了本问题的范围。其目的是替换: [与\[ ]与\] (与\( )与\) \与\ 声明如下: 替换字符串可以包含\n(其中n是1到9)到 指示与第n个括号匹配的源子字符串 应该插入模式的子表达式,并且它可以包含\& 指示匹配整个模式的子字符串应为 插入。写入\如果需要在 替换文本 然而

我正在使用PostgreSQL
regexp\u replace
函数对字符串中的方括号、圆括号和反斜杠进行转义,以便我可以将该字符串本身用作正则表达式模式(在使用该字符串之前,还对该字符串进行了其他操作,但这些操作超出了本问题的范围。其目的是替换:

[
\[

]
\]

\(

\)

\
\

声明如下:

替换字符串可以包含\n(其中n是1到9)到 指示与第n个括号匹配的源子字符串 应该插入模式的子表达式,并且它可以包含\& 指示匹配整个模式的子字符串应为 插入。写入\如果需要在 替换文本

然而,
regexp\u replace('abc[def]','([\[\]\(\)\\\]\)',E'\\\1','g');
产生
abc\def\

在同一页的下面,给出了一个例子,它使用了
\\1
符号-所以我试过了

然而,
regexp\u replace('abc[def]”,“([\[\]\(\)\\\]\)”,E'\\\\1','g');
产生了
abc\1def\1

我想这是意料之中的,但是
regexp\u replace('abc[def]','([\[\]\(\)\\\]),E'.\\1',g');
产生
abc[def.]
。也就是说,转义可以使用标准反斜杠以外的字符


此时我不知道如何继续。我能做些什么才能真正给我想要的替换?好的,找到了答案。显然,我需要在替换中双转义反斜杠。另外,我需要在搜索模式中对旧版本的postgres(我的例子是8.3)进行前缀和双转义反斜杠。最终代码如下所示:

regexp_replace('abc [def]', E'([\\[\\]\\(\\)\\\\\?\\|_%])', E'\\\\\\1', 'g')
是的,它看起来很可怕,但它确实有效:)

这是最简单的方法

select regexp_replace('abc [def]', '([\[\]\(\)\\])', '\\\1', 'g')

如果您启用了
标准一致性字符串
(这是最新版本中的默认设置),并且不使用
E
前缀,则可以消除很多反斜杠,而且看起来不那么可怕:
regexp\u replace('abc[def]','([\[\]\(\)\?\\\\\\\\\\%]),'\\\1','g')
@kgrittn是的,我很感激。不幸的是,我们的服务器是8.3,这是必需的。如果没有
E
,它会抱怨如果使用转义,则需要
E
,而使用
E
则需要双重转义。这很公平。对于记录,您可以在8.2以后的任何版本中启用
标准字符串
,但在9.0之前它都不是默认值。
E
前缀虽然看起来更难看,但其优点是无论此设置如何都可以工作。