REGEXP_REPLACE用小写的相同文本替换文本

时间:2016-04-02 13:30:45

标签: plsql regexp-replace

我试图在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

2 个答案:

答案 0 :(得分:0)

Oracle11g)以下是替换第一次出现的方法:

使用REGEXP_instrREGEXP_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;