2012-12-28 39 views
0

清理,使用Oracle正則表達式 - 掩蔽基於模式

用的Oracle 11g PL/SQL,下面的查詢,可我得到的捕捉組位置(像什麼Matcher.start()提供JAVA)。

`select regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2') from dual` 

結果應該是這樣的: 「區」,9(文字 「區」 的開始)。

更大的問題,我試圖解決的是掩蓋使用模式,如「^ ......(。*).. $」(這種模式可以根據安裝不同而異),如賬號數據。

+0

開始賞金出現的順序! –

+2

仍然有點混淆你想要的東西。你能給出一個簡單的輸入/輸出想要的結果的例子嗎? – tbone

+0

我在@tbone這裏;我不知道你想要掩飾什麼,以及你想要它看起來像什麼。 – Ben

回答

0

1:使用本

regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace( pattern, '(\()', '\1#') , '(\))', '#\1') , '\(#', ')#') , '\^\)#', '^') , '#\)\$', '$') , '#\)', '(#') , '#', '') , '\^([^\(]+\))', '^(\1') , '\(([^\)]+)\$', '(\1)$');

所以反向模式,; 「^ .. $(。)(。)。」變成「^。(..)。(。)$」;

2:對文本到被掩蓋的同時匹配模式:兩個模式

SELECT REGEXP_instr(pattern, '\(.*?\)+', 1, LEVEL) bulk collect into posCapture FROM v CONNECT BY LEVEL <= REGEXP_COUNT(pattern, '\(.*?\)');

3中使用此批量收集指標和捕獲組的數量。合併他們在步驟2

select regexp_replace(v_src, pattern, '\' || captureIndex) into tempStr from dual;

0

威爾類似下面爲你工作?

select regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2') expr ,instr('1234bankzone1234',regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2')) pos from dual

或更可讀的子查詢像

select a.*, instr(a.value,a.expr) from ( select '1234bankzone1234' value, regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2') expr from dual ) a

我找不到類似的功能匹配器API的任何直接等同,也沒有辦法,你可以在SQL中訪問位置組緩衝區。

+0

這可能會在某些情況下導致問題。 – Paddy

+0

這可能會在某些情況下導致問題。如果有多個捕獲組和一個匹配是另一個捕獲組的子集(假設2個捕獲組具有「區域」和「區域」匹配),那麼我就會錯過其中的一個。使用不同類型的數據(設備ID,帳戶/ PAN /客戶#等)和多個安裝,風險會更高。 – Paddy

+0

確實如此。你知道你想要掩蓋的文字的大小和掩蓋的文字大小,以及你們內部的羣組/模式的數量?我問的原因是以某種方式進行分組更多是將字符串拆分並將它們放在一起。只要你有<5-7個不同的組,我們可以在SQL中完成。 – Baski