Um die Frage ganz oben zu beantworten:
Escape-Funktion für reguläre Ausdrücke
Beginnen wir mit einer vollständigen Liste von Zeichen mit besonderer Bedeutung in regulären Ausdrücken Muster:
!$()*+.:<=>?[\]^{|}-
Eingehüllt in einen Klammerausdruck verlieren die meisten ihre besondere Bedeutung - mit wenigen Ausnahmen:
-muss an erster oder letzter Stelle stehen oder gibt einen Bereich an von Zeichen.]und\müssen mit\maskiert werden (auch im Ersatz).
Nach dem Hinzufügen von einfangenden Klammern für die Rückreferenz unten erhalten wir dieses Regexp-Muster:
([!$()*+.:<=>?[\\\]^{|}-])
Damit maskiert diese Funktion alle Sonderzeichen mit einem Backslash (\ ) - wodurch die besondere Bedeutung entfällt:
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$;
Fügen Sie PARALLEL SAFE hinzu (weil es ist ) in Postgres 10 oder höher, um Parallelität für Abfragen zu ermöglichen, die es verwenden.
Demo
SELECT f_regexp_escape('test(1) > Foo*');
Rückgabe:
test\(1\) \> Foo\*
Und dabei:
SELECT 'test(1) > Foo*' ~ 'test(1) > Foo*';
gibt FALSE zurück , was naive Benutzer überraschen mag,
SELECT 'test(1) > Foo*' ~ f_regexp_escape('test(1) > Foo*');
Gibt TRUE zurück wie es jetzt sein sollte.
LIKE Escape-Funktion
Der Vollständigkeit halber das Pendant für LIKE Muster, bei denen nur drei Zeichen besonders sind:
\%_
Das Handbuch:
Das Standard-Escape-Zeichen ist der Backslash, aber mit ESCAPE kann ein anderes gewählt werden Klausel.
Diese Funktion nimmt den Standard an:
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$;
Wir könnten das elegantere regexp_replace() verwenden auch hier, bis auf die wenigen Zeichen, eine Kaskade von replace() Funktionen ist schneller.
Nochmals, PARALLEL SAFE in Postgres 10 oder höher.
Demo
SELECT f_like_escape('20% \ 50% low_prices');
Rückgabe:
20\% \\ 50\% low\_prices