上部の質問に対処するには:
正規表現エスケープ関数
正規表現で特別な意味を持つ文字の完全なリストから始めましょう パターン:
!$()*+.:<=>?[\]^{|}-
角かっこ式にラップされると、それらのほとんどは特別な意味を失います-いくつかの例外を除いて:
-
-
最初または最後である必要があります。そうでない場合は、範囲を示します。 文字の。 -
]
および\
\
でエスケープする必要があります (交換でも)
以下の後方参照用にキャプチャ括弧を追加すると、次の正規表現パターンが得られます。
([!$()*+.:<=>?[\\\]^{|}-])
この関数を使用すると、この関数はすべての特殊文字を円記号(\
)でエスケープします。 )-それによって特別な意味を取り除きます:
CREATE OR REPLACE FUNCTION f_regexp_escape(text)
RETURNS text
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS
$func$
SELECT regexp_replace($1, '([!$()*+.:<=>?[\\\]^{|}-])', '\\\1', 'g')
$func$;
PARALLEL SAFE
を追加します ( )Postgres 10以降で、それを使用するクエリの並列処理を可能にします。
デモ
SELECT f_regexp_escape('test(1) > Foo*');
返品:
test\(1\) \> Foo\*
そしてその間:
SELECT 'test(1) > Foo*' ~ 'test(1) > Foo*';
FALSE
を返します 、これはナイーブなユーザーにとっては驚きかもしれません
SELECT 'test(1) > Foo*' ~ f_regexp_escape('test(1) > Foo*');
TRUE
を返します 今のように。
LIKE
エスケープ機能
完全を期すために、 LIKE
のペンダント 3文字だけが特別なパターン:
\%_
マニュアル:
デフォルトのエスケープ文字は円記号ですが、
ESCAPE
を使用して別のエスケープ文字を選択できます 条項。
この関数はデフォルトを想定しています:
CREATE OR REPLACE FUNCTION f_like_escape(text)
RETURNS text
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS
$func$
SELECT replace(replace(replace($1
, '\', '\\') -- must come 1st
, '%', '\%')
, '_', '\_');
$func$;
よりエレガントなregexp_replace()
を使用できます ここでも、ただし、いくつかの文字については、replace()
のカスケード 関数はより高速です。
繰り返しますが、PARALLEL SAFE
Postgres10以降で。
デモ
SELECT f_like_escape('20% \ 50% low_prices');
返品:
20\% \\ 50\% low\_prices