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.].也就是说,转义适用于标准反斜杠以外的字符.
此时我不知道该怎么办.我能做些什么来实际给我我想要的替代品?
好的,找到了答案.显然,我需要在替换中双重逃避反斜杠.另外,我需要E在旧版本的postgres(在我的例子中为8.3)的搜索模式中使用-prefix和double-escape反斜杠.最终代码如下所示:
regexp_replace('abc [def]', E'([\\[\\]\\(\\)\\\\\?\\|_%])', E'\\\\\\1', 'g')
Run Code Online (Sandbox Code Playgroud)
是的,它看起来很可怕,但它的工作原理:)
| 归档时间: |
|
| 查看次数: |
2961 次 |
| 最近记录: |