Chcete-li odpovědět na otázku nahoře:
Funkce escape regulárního výrazu
Začněme úplným seznamem znaků se zvláštním významem v regulárním výrazu vzory:
!$()*+.:<=>?[\]^{|}-
Zabalené do výrazu v závorce většina z nich ztrácí svůj zvláštní význam – až na pár výjimek:
-
musí být první nebo poslední nebo znamená rozsah postav.]
a\
musí být escapovány pomocí\
(i v náhradě).
Po přidání závorek pro zachycení zpětné reference níže dostaneme tento vzor regulárního výrazu:
([!$()*+.:<=>?[\\\]^{|}-])
Pomocí této funkce tato funkce uzavře všechny speciální znaky zpětným lomítkem (\
) - čímž se odstraní speciální význam:
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$;
Přidejte PARALLEL SAFE
(protože je ) v Postgresu 10 nebo novějším, abyste umožnili paralelismus pro dotazy, které jej používají.
Ukázka
SELECT f_regexp_escape('test(1) > Foo*');
Vrátí:
test\(1\) \> Foo\*
A zatímco:
SELECT 'test(1) > Foo*' ~ 'test(1) > Foo*';
vrátí FALSE
, což může být pro naivní uživatele překvapením,
SELECT 'test(1) > Foo*' ~ f_regexp_escape('test(1) > Foo*');
Vrátí TRUE
jak by teď mělo.
LIKE
escape funkce
Pro úplnost přívěsek za LIKE
vzory, kde jsou speciální pouze tři znaky:
\%_
Manuál:
Výchozí znak escape je zpětné lomítko, ale pomocí
ESCAPE
lze vybrat jiný doložka.
Tato funkce předpokládá výchozí:
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$;
Mohli bychom použít elegantnější regexp_replace()
zde také, ale pro pár znaků kaskáda replace()
funkce je rychlejší.
Opět PARALLEL SAFE
v Postgres 10 nebo novějším.
Ukázka
SELECT f_like_escape('20% \ 50% low_prices');
Vrátí:
20\% \\ 50\% low\_prices