के लिए समर्थन की कमी के कारण और शब्द सीमा(\b
)
नियमित अभिव्यक्ति के Oracle कार्यान्वयन में, एकल REGEXP_REPLACE
बुलाना। विशेष रूप से मामले के लिए, एगोर स्क्रीप्टुनॉफ द्वारा इंगित किया गया
:पैटर्न मिलान, एक के बाद एक उनके बीच केवल एक विभाजक के साथ some some some some ...
.
इस मामले के बिना इस कॉल के साथ ऐसे सभी स्ट्रिंग्स का मिलान करना संभव है:
regexp_replace(
source_string, -- source string
'([^[:alnum:]]|^)((\d)*some(\d)*)([^[:alnum:]]|$)', -- pattern
'\1\5', -- leave separators in place
1, -- start from beginning
0, -- replace all occurences
'im' -- case-insensitive and multiline
);
पैटर्न भाग:
( -- start of Group #1
[^[:alnum:]] -- any non-alphanumeric character
| -- or
^ -- start of string or start of line
) -- end of Group #1
( -- start of Group #2
( -- start of Group #3
\d -- any digit
) -- end of Group #3
* -- include in previous group zero or more consecutive digits
some -- core string to match
( -- start of group #4
\d -- any digit
) -- end of group #4
* -- include in previous group zero or more consecutive digits
) -- end of Group #2
( -- start of Group #5
[^[:alnum:]] -- any non-alphanumeric character
| -- or
$ -- end of string or end of line
) -- end of Group #5
चूंकि मिलान के लिए उपयोग किए जाने वाले विभाजक (समूह # 1 और समूह # 5) मिलान पैटर्न में शामिल हैं, इसे सफल मिलान पर स्रोत स्ट्रिंग से हटा दिया जाएगा, इसलिए हमें तीसरे regexp_replace
में निर्दिष्ट करके इस भाग को पुनर्स्थापित करने की आवश्यकता है। पैरामीटर।
इस समाधान के आधार पर लूप के भीतर सभी, यहां तक कि दोहराव वाली घटनाओं को बदलना संभव है।
उदाहरण के लिए, आप एक फ़ंक्शन को इस तरह परिभाषित कर सकते हैं:
create or replace function delete_str_with_digits(
pSourceString in varchar2,
pReplacePart in varchar2 -- base string (like 'some' in question)
)
return varchar2
is
C_PATTERN_START constant varchar2(100) := '([^[:alnum:]]|^)((\d)*';
C_PATTERN_END constant varchar2(100) := '(\d)*)([^[:alnum:]]|$)';
vPattern varchar2(4000);
vCurValue varchar2(4000);
vPatternPosition binary_integer;
begin
vPattern := C_PATTERN_START || pReplacePart || C_PATTERN_END;
vCurValue := pSourceString;
vPatternPosition := regexp_instr(vCurValue, vPattern);
while(vPatternPosition > 0) loop
vCurValue := regexp_replace(vCurValue, vPattern,'\1\5',1,0,'im');
vPatternPosition := regexp_instr(vCurValue, vPattern);
end loop;
return vCurValue;
end;
और इसे SQL या अन्य PL/SQL कोड के साथ प्रयोग करें:
SELECT
delete_str_with_digits(
'some text, -> awesome <- 123 someone, 3some3
line of 7 :> some some some some some some some <
222some another some1? some22 text 0some000',
'some'
) as result_string
FROM
dual