我正在使用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}}。也就是说,转义适用于标准反斜杠以外的字符。
此时我不知道该怎么办。我能做些什么才能真正给我替换?
答案 0 :(得分:5)
E
- 在旧版postgres的搜索模式中使用前缀和双重转义反斜杠(在我的例子中为8.3)。最终代码如下所示:
regexp_replace('abc [def]', E'([\\[\\]\\(\\)\\\\\?\\|_%])', E'\\\\\\1', 'g')
是的,它看起来很糟糕,但它有效:)
答案 1 :(得分:2)
最简单的方式
select regexp_replace('abc [def]', '([\[\]\(\)\\])', '\\\1', 'g')