Aby odpowiedzieć na pytanie na górze:
Funkcja ucieczki wyrażeń regularnych
Zacznijmy od pełnej listy znaków o specjalnym znaczeniu w wyrażeniu regularnym wzory:
!$()*+.:<=>?[\]^{|}-
Ujęte w nawiasy wyrażenia, większość z nich traci swoje szczególne znaczenie - z kilkoma wyjątkami:
-
musi być pierwszy lub ostatni lub oznacza zakres znaków.]
i\
muszą być escapowane za pomocą\
(również w zamian).
Po dodaniu nawiasów przechwytujących dla poniższego odniesienia wstecznego otrzymujemy następujący wzorzec wyrażenia regularnego:
([!$()*+.:<=>?[\\\]^{|}-])
Używając go, ta funkcja wyprowadza wszystkie znaki specjalne z odwrotnym ukośnikiem (\
) - usuwając tym samym specjalne znaczenie:
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$;
Dodaj PARALLEL SAFE
(ponieważ jest) ) w Postgresie 10 lub nowszym, aby umożliwić równoległość zapytań, które go używają.
Demo
SELECT f_regexp_escape('test(1) > Foo*');
Zwroty:
test\(1\) \> Foo\*
A gdy:
SELECT 'test(1) > Foo*' ~ 'test(1) > Foo*';
zwraca FALSE
, co może zaskoczyć naiwnych użytkowników,
SELECT 'test(1) > Foo*' ~ f_regexp_escape('test(1) > Foo*');
Zwraca TRUE
tak jak powinno teraz.
LIKE
funkcja ucieczki
Aby uzyskać kompletność, wisiorek dla LIKE
wzorce, w których tylko trzy znaki są specjalne:
\%_
Instrukcja:
Domyślnym znakiem ucieczki jest ukośnik odwrotny, ale można wybrać inny, używając ESCAPE
klauzula.
Ta funkcja zakłada domyślne:
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$;
Moglibyśmy użyć bardziej eleganckiego regexp_replace()
tutaj też, ale dla kilku znaków, kaskada replace()
funkcje są szybsze.
Ponownie, PARALLEL SAFE
w Postgresie 10 lub nowszym.
Demo
SELECT f_like_escape('20% \ 50% low_prices');
Zwroty:
20\% \\ 50\% low\_prices