4

我正在使用 PostgreSQLregexp_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.]. 也就是说,转义适用于标准反斜杠以外的字符。

在这一点上,我不知道如何进行。我该怎么做才能真正给我想要的替代品?

4

2 回答 2

5

好的,找到答案了。显然,我需要在替换中双重转义反斜杠。此外,我需要E在旧版本的 postgres(在我的情况下为 8.3)的搜索模式中添加 -prefix 和双转义反斜杠。最终代码如下所示:

regexp_replace('abc [def]', E'([\\[\\]\\(\\)\\\\\?\\|_%])', E'\\\\\\1', 'g')

是的,它看起来很可怕,但它有效:)

于 2012-08-23T10:12:30.917 回答
2

这是最简单的方法

select regexp_replace('abc [def]', '([\[\]\(\)\\])', '\\\1', 'g')
于 2014-01-14T08:41:34.270 回答