2012-02-03 50 views
1

我必須編寫一個查詢,其中基於java的正則表達式(我相信POSIX標準)將發送到存儲過程。這將使用這個正則表達式字符串來查詢數據庫,只提取那些統計正則表達式的記錄。使用基於Java的正則表達式來查詢Oracle

我讀到有關Regular Expressions,我看到,甲骨文正則表達式的不一樣的Java即

隨着版本10g中,Oracle數據庫提供你 可以在SQL和PL/SQL中使用4正則表達式功能聲明。這些功能實現了POSIX擴展正則表達式(ERE)標準 。 Oracle完全支持 表達式支持整理序列和等價類。 NLS_SORT設置確定使用的POSIX語言環境, ,它確定可用的整理順序和等效的 類。

但是,Oracle並未完全實現POSIX ERE標準。它 偏離三個領域。首先,Oracle在正則表達式中支持反向\ 1 到\ 9。 POSIX ERE標準並不支持這些標準,儘管POSIX BRE標準不支持。在完全符合標準的 引擎中,\ 1到\ 9將是非法的。 POSIX標準規定, 是非法的,用於反轉不是具有 反斜槓的元字符。 Oracle允許這樣做,並簡單地忽略反斜槓。例如。 \ z與Oracle中的z相同。其結果是,所有POSIX ERE 正則表達式可以用於Oracle,但一些正規 表達式,在甲骨文工作,可以在符合POSIX標準的完全 引擎導致錯誤。顯然,如果你只使用Oracle,那麼這些差異是無關緊要的。

第三個區別更微妙。它不會導致任何錯誤,但 可能導致不同的匹配。正如我在有關 POSIX標準的主題中所解釋的那樣,它需要正則表達式引擎在交替情況下返回匹配時間最長的 。 Oracle的引擎不會這樣做。它是傳統NFA引擎的 ,與本網站上討論的所有非POSIX正則風味 一樣。

如果你使用正則表達式在其他編程語言 工作,請注意POSIX不支持非打印 字符轉義像\ t表示標籤或\ n作爲換行符。您可以使用 這些與POSIX引擎一起使用C++等編程語言,因爲 C++編譯器將解釋字符串常量中的\ t和\ n。在 SQL語句,你需要用你的正則表達式鍵入 串的實際翼片或線路中斷,使之匹配標籤或行 突破。當作爲regexp參數傳遞時,Oracle的正則表達式引擎會將字符串'\ t'解釋爲 正則表達式t。

想知道是否有某種幫助我可以用來解決這個問題?或者我必須將Java正則表達式轉換爲PLSQL正則表達式?

,我們將使用將要在Java中廣泛使用的正則表達式。很少有使用相同的正則表達式應用於Oracle存儲過程的用例。其中一個樣本正則表達式的是.*__.*__^ABC

我相信,這將是方式更有益的,如果我能知道什麼是在這2個版本:)

+0

正如你的報價解釋,它取決於正則表達式 - 一些正則表達式將在兩種實現中起作用。你能向我們展示你的正則表達式嗎?迄今爲止嘗試過什麼? – DNA 2012-02-03 18:25:59

+0

'是發送到存儲過程' 爲什麼你必須這樣做?編寫[與Oracle兼容的正則表達式](http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm)是微不足道的。 – beerbajay 2012-02-03 18:28:01

+1

如果正則表達式是由PL/SQL存儲過程執行的,那麼它應該是一個Oracle正則表達式,不是嗎?從Java角度來看,正則表達式只是傳遞給Oracle的一個純字符串。應該沒有理由進行任何正則表達式轉換。 – user272735 2012-02-03 18:51:45

回答

1

首先,收集所有使用/預期的正則表達式和運行的不兼容在樣本/測試表上查看一些查詢,看看是否有可用於Java的正則表達式,但不在Oracle中。也許根本沒有任何問題,因爲Oracle文檔說它支持正則表達式的POSIX和Unicode標準,並且它增強了它們。

如果您發現在Oracle中不起作用的正則表達式,那麼您可以考慮使用PL/SQL封裝器開發Java存儲過程,並在您的查詢中使用它。那肯定不會有問題的。

+0

正則表達式是未知atm ..它可能是任何東西。 – 2012-02-06 18:16:34

+0

在這種情況下,我首先假設沒有問題,並開發一個使用正則表達式的簡單查詢。我想,你將在PDLC中有一個QA階段;你會發現如果有任何棘手的正則表達式,甲骨文解釋不同。在此期間,我會玩正則表達式,看看能否找到差異。此外,我會告訴項目經理或業務相關人員獲取/生成用例文檔,因爲如果沒有適當的需求規格,開發人員無法正常工作...... – 2012-02-08 08:21:10