2015-05-19 66 views
0

目前我得到一个很长的输入字符串,我想通过regexp_replace反向。通常我使用这个(从PL/SQL的开始子句中)替换字符串位置Oracle中对Regep_replace有组限制吗? (与regexp_replace问题)

variable:= regexp_replace(variable, '(.+) (.+) (.+) (.+)', '\4 \3 \2 \1'); 

在这种情况下我variabele会以相反的顺序进行更换,和它的作品。现在我的问题和我的问题是。制作小组是否有限制?因为我也有这个字符串:

US 816909877808647715885542447721 UOPX 

我把这个字符串作为输入到我的功能和作用开始改变这个字符串。在某个时候,它会使四人组(也在工作)。为此,我现在用的是以下几点:

variable:= regexp_replace(variable, '(....)', '\1 '); 

导致下一输出:

3630 3139 3634 8169 0987 7808 6477 1588 5542 4477 21 -- also did ASCII to number 

所以此刻我得到了我想要的东西。整个琴弦被分成四组。但现在我的问题是,当我要扭转这些11组使用此代码:

convertedStudentNumber := regexp_replace(convertedStudentNumber, '(.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+)', '\11 \10 \9 \8 \7 \6 \5 \4 \3 \2 \1'); 

这是我的结果:

36301 36300 5542 1588 6477 7808 0987 8169 3634 3139 3630 

,当我不逆转与9组如下组:

variable:= regexp_replace(variable, '(.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+)', '\9 \8 \7 \6 \5 \4 \3 \2 \1'); 

这是我的结果:

21 4477 5542 1588 6477 7808 0987 8169 3630 3139 3634 

与我得到的9组更接近我想要实现的。但最后三组仍然无法用一种奇怪的方式修复。

21 4477 5542 1588 6477 7808 0987 8169 [3630 3139 3634]--won't work. 

总之。这是我的字符串,我想通过组

3630 3139 3634 8169 0987 7808 6477 1588 5542 4477 21 

扭转,但我并不比

21 4477 5542 1588 6477 7808 0987 8169 [3630 3139 3634] 
+0

这似乎不是重复给我。我认为问题是要求解决问题的帮助,而不仅仅是“Oracle反向引用只能达到9”。 –

+0

也许你可以将你的字符串分成一组四个和一组五个,每组反转一组,然后按照相反的顺序将组合回去?否则,您可以将其标记并将它们重新排列在一起。 –

+0

@AlexPoole,我打算提出类似的解决方案,但不能解决问题。 –

回答

2

甲骨文只允许9个反向引用,所以你将无法使用\ 10或更高进一步得到。 但是,为什么不把你的字符串和每个组进行反转?

例如:

create table test (
    v varchar(100) 
); 

insert into test values ('363031393634816909877808647715885542447721'); 

select v, regexp_replace(v, '([0-9]{4})', '\1 ') as v_replaced 
from test; 

结果:

3630 3139 3634 8169 0987 7808 6477 1588 5542 4477 21 

立即反向每个数字组(技术从这里采取:Reverse String Word by Word using SQL):顺序

WITH str_tab(str1, rn) AS 
(SELECT regexp_substr(str, '[^\[:space:]]+', 1, LEVEL), 
     LEVEL 
    FROM (SELECT regexp_replace(v, '([0-9]{4})', '\1 ') str 
      FROM test) tab 
CONNECT BY LEVEL <= LENGTH(str) - LENGTH(REPLACE(str, ' ')) + 1) 
SELECT listagg(str1, ' ') WITHIN GROUP (ORDER BY rn DESC) AS new_text 
    FROM str_tab; 

结果:

21 4477 5542 1588 6477 7808 0987 8169 3634 3139 3630 

这里是一个PL/SQL脚本,同样的事情:

declare 
    variable varchar(100) := '363031393634816909877808647715885542447721'; 
begin 
    -- You don't need these next two lines. 
    -- They just show you the variable modified to have a space 
    -- after every four digits. You can remove these lines. 
    variable := regexp_replace(variable, '([0-9]{4})', '\1 '); 
    dbms_output.put_line('variable: ' || variable); 

    -- Get the reversed string INTO the variable 
    WITH str_tab(str1, rn) AS 
    (SELECT regexp_substr(str, '[^\[:space:]]+', 1, LEVEL), LEVEL 
    FROM (SELECT regexp_replace(variable, '([0-9]{4})', '\1 ') str FROM test) tab 
    CONNECT BY LEVEL <= LENGTH(str) - LENGTH(REPLACE(str, ' ')) + 1) 
    SELECT listagg(str1, ' ') WITHIN GROUP (ORDER BY rn DESC) AS new_text 
    INTO variable 
    FROM str_tab; 

    dbms_output.put_line('variable: ' || variable); 
end; 

CONNECT BY级别定义在一个层次中的父和子行之间的关系。要理解它,看看分层查询的文档中的层次查询例子:http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm

尝试运行此查询:

SELECT regexp_substr(str, '[^\[:space:]]+', 1, LEVEL) number_group, LEVEL 
FROM (SELECT regexp_replace('363031393634816909877808647715885542447721', '([0-9]{4})', '\1 ') str FROM test) 
CONNECT BY LEVEL <= LENGTH(str) - LENGTH(REPLACE(str, ' ')) + 1; 

结果:

NUMBER_GROUP LEVEL 
3630   1 
3139   2 
3634   3 
8169   4 
0987   5 
7808   6 
6477   7 
1588   8 
5542   9 
4477   10 
21   11 

LENGTH(str)是长度(放入空格后),即52。LENGTH(REPLACE(str, ' '))是移除空格的长度,即42。如果取(52-42)+1,则得到11,这是我们需要的行数为所有的号码组NGS。然后,我们只需按照DESC顺序采用该列表并使用LISTAGG(以空格作为分隔符)重新组合字符串。

+0

感谢您的评论。我试图阻止代码,但对我来说太困难了。抱歉。有没有更简单的方法?让我困惑的是“按级别连接”为“组内”。有没有办法做到这一点,而不创建一个表和没有选择语句? ps:我是新的PL/SQL。如果我问你太多,我可以理解。欢呼 –

+0

你不需要创建一个表。我这样做只是为了显示我从哪里获得价值。在我的例子中,v和你的“变量”是一样的。你是从表中选择它,把它作为一个过程的输入参数还是别的? –

+0

字符串值来自测试用例。它不是来自桌子,程序,功能或任何其他。具有多个字符串的测试用例是检查我所做的功能是否可以验证测试用例字符串。我已经有了一个函数,在这个函数中,我需要组成四个组,然后反转单词(还有更多..),但我坚持扭转 –