Plsql REGEXP\u替换为小写的相同文本

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 结果: 或者这是因为我对我的练

我试图在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
结果: 或者这是因为我对我的练习有点困惑:

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;