За да отговорите на въпроса в горната част:
Изходна функция на регулярния израз
Нека започнем с пълен списък със знаци със специално значение в регулярния израз модели:
!$()*+.:<=>?[\]^{|}-
Обвити в израз в скоби, повечето от тях губят специалното си значение - с няколко изключения:
-
трябва да бъде първи или последен или означава диапазон от знаци.]
и\
трябва да се екранира с\
(и в подмяната).
След добавяне на улавяне на скоби за обратната препратка по-долу получаваме този модел на регулярни изрази:
([!$()*+.:<=>?[\\\]^{|}-])
Използвайки я, тази функция избягва всички специални символи с обратна наклонена черта (\
) - като по този начин се премахва специалното значение:
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
escape функция
За пълнота висулката за LIKE
шаблони, където само три знака са специални:
\%_
Ръководството:
Escape-символът по подразбиране е обратната наклонена черта, но може да бъде избран различен с помощта на
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
в Postgres 10 или по-нова версия.
Демо
SELECT f_like_escape('20% \ 50% low_prices');
Връща:
20\% \\ 50\% low\_prices