शीर्ष पर प्रश्न का समाधान करने के लिए:
रेगुलर एक्सप्रेशन एस्केप फंक्शन
आइए रेगुलर एक्सप्रेशन . में विशेष अर्थ वाले वर्णों की पूरी सूची के साथ प्रारंभ करें पैटर्न:
!$()*+.:<=>?[\]^{|}-
एक कोष्ठक अभिव्यक्ति में लिपटे हुए उनमें से अधिकांश अपना विशेष अर्थ खो देते हैं - कुछ अपवादों के साथ:
-
पहले या अंतिम होना चाहिए या यह एक श्रेणी . को दर्शाता है पात्रों की।]
और\
\
. से बचना होगा (प्रतिस्थापन में भी)।
नीचे दिए गए बैक रेफरेंस के लिए कैप्चरिंग कोष्ठक जोड़ने के बाद हमें यह रेगेक्सपी पैटर्न मिलता है:
([!$()*+.:<=>?[\\\]^{|}-])
इसका उपयोग करके, यह फ़ंक्शन बैकस्लैश के साथ सभी विशेष वर्णों से बच निकलता है (\
) - इस प्रकार विशेष अर्थ को हटा रहा है:
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
जोड़ें (क्योंकि यह है ) पोस्टग्रेज 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
. के लिए पेंडेंट पैटर्न, जहां केवल तीन वर्ण विशेष हैं:
\%_
मैनुअल:
<ब्लॉकक्वॉट>
डिफ़ॉल्ट एस्केप कैरेक्टर बैकस्लैश है, लेकिन 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
पोस्टग्रेज 10 या बाद के संस्करण में।
डेमो
SELECT f_like_escape('20% \ 50% low_prices');
रिटर्न:
20\% \\ 50\% low\_prices