यह काम करना चाहिए बशर्ते आपके पास %ABC#%ABC#
जैसा दिखने वाला इनपुट न हो
SELECT REGEXP_REPLACE( '%ABC#abc\%ABC#', '((^|[^\])(\\\\)*)%ABC#', '\1XXX' )
FROM DUAL;
यह या तो मेल खाएगा:
- स्ट्रिंग की शुरुआत
^
या एक गैर-स्लैश वर्ण[^\]
उसके बाद स्लैश वर्णों के जोड़े की संख्या, अंत में, वर्ण%ABC#
. यह%ABC#
. से मेल खाएगा ,\\%ABC#
,\\\\%ABC#
और इसी तरह, लेकिन\%ABC#
से मेल नहीं खाएगा ,\\\%ABC#
,\\\\\%ABC#
जहां%
. से बचने के लिए एक स्लैश है चरित्र।
प्रतिस्थापन में पहला कैप्चर समूह शामिल है क्योंकि अभिव्यक्ति पिछले गैर-स्लैश वर्ण और स्लैश के जोड़े से मेल खा सकती है और इन्हें आउटपुट में संरक्षित करने की आवश्यकता है।
अपडेट करें
यह थोड़ा जटिल हो जाता है लेकिन यह बार-बार मिलान करेगा:
WITH Data ( VALUE ) AS (
SELECT '%ABC#%ABC#' FROM DUAL
)
SELECT ( SELECT LISTAGG(
REGEXP_REPLACE( COLUMN_VALUE, '((^|[^\])(\\\\)*)%ABC#$', '\1XXX' ),
NULL
) WITHIN GROUP ( ORDER BY NULL )
FROM TABLE(
CAST(
MULTISET(
SELECT REGEXP_SUBSTR( d.value, '.*?(%ABC#|$)', 1, LEVEL )
FROM DUAL
CONNECT BY LEVEL < REGEXP_COUNT( d.value, '.*?(%ABC#|$)' )
AS SYS.ODCIVARCHAR2LIST
)
)
) AS Value
FROM Data d;
यह स्ट्रिंग को उप-स्ट्रिंग में विभाजित करने के लिए एक सहसंबद्ध उप-क्वेरी का उपयोग करता है जो %ABC#
के साथ समाप्त होता है या एंड-ऑफ-स्ट्रिंग (यह TABLE( CAST( MULTISET( ) .. ) )
के अंदर थोड़ा सा है ) और फिर प्रत्येक उप-स्ट्रिंग के अंत में प्रतिस्थापन करने के बाद इन उप-स्ट्रिंग को पुन:संयोजित करता है।