我试图在PL / SQL中使用REGEXP_REPLACE
来替换一些带有相同文本的小写文本。实际上,规则是我希望只有一个char的"()"
之间的所有文本都是小写的。
以下是一个例子:
SELECT REGEXP_REPLACE(
'i want what what is between <> in lower case : I am a test(E) (A) (HELLO)'
, '(\(\D\))', '<\1>'
) FROM DUAL
I want what is between <> in lower case : I am a test(e) (a) (HELLO)
或者这是因为我对我的运动有点困惑:
I want what is between <> in lower case : I am a test<(e)> <(a)> (HELLO)
如何以小写字母显示文字?我尝试了几种方法,但我无法摆脱它。我不知道如何热议REGEXP_REPLACE
将"\1"
内容放在小写字母中。
感谢您的帮助。
祝你好运。 MS
答案 0 :(得分:0)
(Oracle11g
)以下是替换第一次出现的方法:
REGEXP_instr
和REGEXP_substr
可以将lower
应用于匹配的模式 SELECT substr(it, 1 , REGEXP_instr( it, '(\(\D\))')-1)
||lower( REGEXP_substr(it, '(\(\D\))') )
||substr(it, REGEXP_instr( it, '(\(\D\))')+3, length(it))
FROM (SELECT 'i want what what is between <> in lower case : I am a test(E) (A) (HELLO)' it from dual) ;
如果您想要围绕它的奇怪<>
:
SELECT substr(it, 1 , REGEXP_instr( it, '(\(\D\))')-1)
|| '<'
||lower( REGEXP_substr(it, '(\(\D\))') )
|| '>'
||substr(it, REGEXP_instr( it, '(\(\D\))')+3, length(it))
FROM (SELECT 'i want what what is between <> in lower case : I am a test(E) (A) (HELLO)' it from dual) ;
我认为你不能在Oracle中使用recursive regexp。因此,如果您希望能够替换2次出现:
SELECT substr(rit, 1 , REGEXP_instr( rit, '(\([[:upper:]]{1}\))')-1)
||lower( REGEXP_substr(rit, '(\([[:upper:]]{1}\))') )
||substr(rit, REGEXP_instr( rit, '(\([[:upper:]]{1}\))')+3, length(rit))
from (
(SELECT substr(it, 1 , REGEXP_instr( it, '(\([[:upper:]]{1}\))')-1)
||lower( REGEXP_substr(it, '(\([[:upper:]]{1}\))') )
||substr(it, REGEXP_instr( it, '(\([[:upper:]]{1}\))')+3, length(it)) rit
FROM (SELECT 'i want what what is between <> in lower case : I am a test(E) (A) (HELLO)' it from dual))
) ;
(+我将\D
替换为[[:upper:]]{1}
更准确)
答案 1 :(得分:0)
糟糕,这一直是一个难题!好像很容易。
要处理可变数量的模式,您需要遍历字符串以查找它们。也许有人会使用CONNECT BY
或其他东西提出一个灵活的解决方案,但在此期间,因为你使用的是PL / SQL,为什么不去老派并创建一个功能呢?它可以说更容易维护,并将被包装在一个可供所有人使用的可重复使用的单元中。传递一个字符串,让它返回清理版本。
SQL> select lower_single_letters('I want what is between in lower case : I am a test(E) (A) (HELLO)') text
from dual;
TEXT
--------------------------------------------------------------------------------
I want what is between in lower case : I am a test(e) (a) (HELLO)
SQL>
以下是一些示例代码,因为我想在我的实用程序包中使用一个示例:
CREATE OR REPLACE function lower_single_letters(string_in varchar2) return varchar2 is
tmp_string varchar2(1000) := string_in; -- Holds the string
regex_pattern constant varchar2(20) := '\([[:upper:]]\)'; -- Pattern to look for '(A)'
letter_offset integer; -- Offset of the pattern
letter varchar2(1); -- The letter to lower()
BEGIN
-- Loop while the pattern is found in the string passed in
while regexp_like(tmp_string, regex_pattern)
loop
-- Get the offset in the string
letter_offset := regexp_instr(tmp_string, regex_pattern)+1;
-- Get the letter
letter := substr(tmp_string, letter_offset, 1);
-- Replace it in the string
tmp_string := regexp_replace(tmp_string, '.', lower(letter), 1, letter_offset);
end loop;
-- Return it when the pattern is no longer found
return(tmp_string);
END lower_single_letters;