具有匹配表达式的PostgreSQL regexp_replace

时间:2012-08-23 09:05:08

标签: postgresql plpgsql

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

带有[

\[
] \]的{​​{1}} ( \(的{​​{1}} ) \)的{​​{1}} \\\

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

Postgres documentation page on regular expressions声明如下:

  

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

abc \ def\生成\\1

再往下在同一页面上,给出了一个使用regexp_replace('abc [def]', '([\[\]\(\)\\])', E'\\\\1', 'g');表示法的例子 - 所以我试过了。

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

我猜这是预期的,但abc .[def.]会产生{{1}}。也就是说,转义适用于标准反斜杠以外的字符。

此时我不知道该怎么办。我能做些什么才能真正给我替换?

2 个答案:

答案 0 :(得分:5)

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

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

是的,它看起来很糟糕,但它有效:)

答案 1 :(得分:2)

最简单的方式

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