我必須編寫一個查詢,其中基於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個版本:)
正如你的報價解釋,它取決於正則表達式 - 一些正則表達式將在兩種實現中起作用。你能向我們展示你的正則表達式嗎?迄今爲止嘗試過什麼? – DNA 2012-02-03 18:25:59
'是發送到存儲過程' 爲什麼你必須這樣做?編寫[與Oracle兼容的正則表達式](http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm)是微不足道的。 – beerbajay 2012-02-03 18:28:01
如果正則表達式是由PL/SQL存儲過程執行的,那麼它應該是一個Oracle正則表達式,不是嗎?從Java角度來看,正則表達式只是傳遞給Oracle的一個純字符串。應該沒有理由進行任何正則表達式轉換。 – user272735 2012-02-03 18:51:45