2015-05-19 73 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

字符串值來自測試用例。它不是來自桌子,程序,功能或任何其他。具有多個字符串的測試用例是檢查我所做的功能是否可以驗證測試用例字符串。我已經有了一個函數,在這個函數中,我需要組成四個組,然後反轉單詞(還有更多..),但我堅持扭轉 –