具有匹配表达式的PostgreSQL regexp_replace

Ale*_*s G 4 postgresql plpgsql

我正在使用PostgreSQL regexp_replace函数来转义字符串中的方括号,括号和反斜杠,以便我可以将该字符串用作正则表达式模式本身(在使用它之前还对该字符串进行了其他操作,但它们超出了范围这个问题.想法是取代:

[\[
]具有\]
(\(
)\)
\\\

有关正则表达式的Postgres文档页面说明如下:

替换字符串可以包含\n,其中n是1到9,表示应插入与模式的第n个带括号的子表达式匹配的源子字符串,并且它可以包含\并指示匹配整个模式的子字符串应插入.写\如果需要在替换文本中放置文字反斜杠.

然而regexp_replace('abc [def]', '([\[\]\(\)\\])', E'\\\1', 'g');产生abc \ def\.

再往下一页,给出了一个使用\\1符号的例子- 所以我试过了.

然而,regexp_replace('abc [def]', '([\[\]\(\)\\])', E'\\\\1', 'g');生产abc \1def\1.

我猜这是预期的,但regexp_replace('abc [def]', '([\[\]\(\)\\])', E'.\\1', 'g');产生了abc .[def.].也就是说,转义适用于标准反斜杠以外的字符.

此时我不知道该怎么办.我能做些什么来实际给我我想要的替代品?

Ale*_*s G 5

好的,找到了答案.显然,我需要在替换中双重逃避反斜杠.另外,我需要E在旧版本的postgres(在我的例子中为8.3)的搜索模式中使用-prefix和double-escape反斜杠.最终代码如下所示:

regexp_replace('abc [def]', E'([\\[\\]\\(\\)\\\\\?\\|_%])', E'\\\\\\1', 'g')
Run Code Online (Sandbox Code Playgroud)

是的,它看起来很可怕,但它的工作原理:)