将字段中的文字文本值添加到 postgres 中的正则表达式的正确方法是什么?
例如,如果不转义, some_field 可能包含无效的正则表达式语法,如下所示:
where some_text ~* ('\m' || some_field || '\M');
将字段中的文字文本值添加到 postgres 中的正则表达式的正确方法是什么?
例如,如果不转义, some_field 可能包含无效的正则表达式语法,如下所示:
where some_text ~* ('\m' || some_field || '\M');
最简单的事情是使用正则表达式来准备您的字符串以进入正则表达式。转义字符串中的非单词字符应该足以使其成为正则表达式安全,例如:
=> select regexp_replace('. word * and µ{', E'([^\\w\\s])', E'\\\\\\1', 'g');
regexp_replace
--------------------
\. word \* and µ\{
所以这样的事情通常应该起作用:
where some_text ~* x || regexp_replace(some_field, E'([^\\w\\s])', E'\\\\\\1', 'g') || y
wherex
和y
是正则表达式的其他部分。
如果您最后不需要正则表达式(即y
上面没有),那么您可以使用(?q)
:
ARE 可以以嵌入的选项开始:一个序列
(?xyz)
(xyz
一个或多个字母字符)指定影响 RE 其余部分的选项。
和 aq
意味着:
RE 的其余部分是文字(“引用”)字符串,所有普通字符
所以你可以使用:
where some_text ~* x || '(?q)' || some_field
在这种有限的情况下。