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
ここでx
、y
は正規表現の他の部分です。
最後に正規表現が必要ない場合(つまり、y
上記がない場合)、次を使用できます(?q)
:
AREは、埋め込まれたオプションで開始できます。シーケンス
(?xyz)
(xyz
1つ以上の英字)は、REの残りの部分に影響を与えるオプションを指定します。
とは、次のq
ことを意味します。
REの残りの部分はリテラル(「引用符で囲まれた」)文字列であり、すべて通常の文字です
したがって、次を使用できます。
where some_text ~* x || '(?q)' || some_field
この限られたケースでは。