Plsql REGEXP\u替换为小写的相同文本
我试图在PL/SQL中使用REGEXP_REPLACE来替换某些文本,使其具有小写形式的相同文本。实际上,规则是,我希望只有一个字符的所有文本都是小写的 以下是一个例子:Plsql REGEXP\u替换为小写的相同文本,plsql,regexp-replace,Plsql,Regexp Replace,我试图在PL/SQL中使用REGEXP_REPLACE来替换某些文本,使其具有小写形式的相同文本。实际上,规则是,我希望只有一个字符的所有文本都是小写的 以下是一个例子: SELECT REGEXP_REPLACE( 'i want what what is between <> in lower case : I am a test(E) (A) (HELLO)' , '(\(\D\))', '<\1>' ) FROM DUAL 结果: 或者这是因为我对我的练
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)
我怎样才能得到小写的文本?我试了好几种方法,但都没成功。我不知道如何告诉REGEXP\u REPLACE将\1内容放在小写
谢谢你的帮助
致以最良好的祝愿。
MS使用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) ;
我认为您不能在Oracle中使用递归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},这更准确糟糕,这一定是一个非常困难的问题!看起来很容易 要处理模式的可变出现次数,需要在字符串中循环查找它们。也许有人会想出一个巧妙的解决方案,使用connectby或其他什么,但与此同时,既然您使用的是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;
也许你可以重读你的问题,因为在字符和字符之间有一些混淆。与大写字母和粗体文本使用代码块不同,它更容易被社区和整个人类所接受
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;