使用哪种REGEXP

时间:2016-09-02 23:06:18

标签: oracle plsql

我认为最好用regexp来完成,因为这可能是最短的方式,但其他任何建议都是好的。

说,我在PL / SQL中有一个字符串,并且如果它的小,则想要将每个第N个字符大写,并且如果它的大小则更低。例如,每五个字母。

我想研究实现这一目标的可能性。

感谢。

2 个答案:

答案 0 :(得分:2)

由于星期六晚上我没有更好的事情要做(当然,在Dark Matter之后)我决定挑战我的大脑。所以在得知SQLFiddle坏了之后,我在我的计算机上安装了Oracle 11g R2 Express Edition来解决这个问题......是的,我真的很无聊。

直接来自一张桌子:

drop table test;
create table test (nbr number, txt varChar2(26));

insert into test (nbr, txt) values (1,'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
insert into test (nbr, txt) values (2,'abcdefghijklmnopqrstuvwxyz');
insert into test (nbr, txt) values (3,'ABCDEFGHIJklmnopqrstUVWXYZ');
insert into test (nbr, txt) values (4,'abcdefghijKLMNOPQRSTuvwxyz');

select
  nbr,
  (
    select
      listAgg
      (
        case subStr(subStr(t.txt,((level - 1) * 5) + 1,5),5,1)
          when upper(subStr(subStr(t.txt,((level - 1) * 5) + 1,5),5,1))
            then subStr(subStr(t.txt,((level - 1) * 5) + 1,5),1,4) ||
                 lower(subStr(subStr(t.txt,((level - 1) * 5) + 1,5),5,1))
          when lower(subStr(subStr(t.txt,((level - 1) * 5) + 1,5),5,1))
            then subStr(subStr(t.txt,((level - 1) * 5) + 1,5),1,4) ||
                 upper(subStr(subStr(t.txt,((level - 1) * 5) + 1,5),5,1))
          else subStr(t.txt,((level - 1) * 5) + 1,5)
        end
      )
      within group (order by level)
    from
      dual
    connect by
      subStr(t.txt,((level - 1) * 5) + 1,5) is not null
  ) as "newTxt"
from
  test t
;

或者你可以使用PL / SQL函数:

declare
  function inverseCase(
    txt varChar2,
    nbr number
  )
  return varChar2 as
    newTxt varChar2(254);
    txtSeg varChar2(254);
    segA varChar2(254);
    segB varChar2(254);
  begin
    for i in 0..floor(length(txt)/nbr) loop
      txtSeg := subStr(txt, (i * nbr) + 1, nbr);
      segA := subStr(txtSeg, 1, nbr - 1);
      segB := subStr(txtSeg, nbr, 1);
      newTxt := newTxt || case segB
        when upper(segB) then segA || lower(segB)
        when lower(segB) then segA || upper(segB)
        else txtSeg
      end;
    end loop;
    return newTxt;
  end;
begin
    dbms_output.put_line(inverseCase('ABCDEFGHIJKLMNOPQRSTUVWXYZ',5));
    dbms_output.put_line(inverseCase('abcdefghijklmnopqrstuvwxyz',5));
    dbms_output.put_line(inverseCase('ABCDEFGHIJklmnopqrstUVWXYZ',5));
    dbms_output.put_line(inverseCase('abcdefghijKLMNOPQRSTuvwxyz',5));
end;

两者都返回以下输出。

nbr newTxt
1   ABCDeFGHIjKLMNoPQRStUVWXyZ
2   abcdEfghiJklmnOpqrsTuvwxYz
3   ABCDeFGHIjklmnOpqrsTUVWXyZ
4   abcdEfghiJKLMNoPQRStuvwxYz

我认为这是您正在寻找的文字。

已经有一段时间了,我忘了这个网站在我无聊的时候有多么有趣!

答案 1 :(得分:0)

作为选项之一,您可以使用CASE语句

检查第5个字符
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="myTypingText"></div>

之后会出现问题,因为您必须将字符串分成3,更改字母大小写并将它们连接起来。这将是笨重的。或者使用REPLACE函数,但是,据我所知,它不适用于特定的字符位置,只能使用模式的子字符串,因此最终会再次进行分割和连接。

Regexp可能是最不痛苦的

那就是如果我们将转换限制在SELECT语句中,没有PL / SQL过程