2014-09-10 58 views
2

我無法找到我的模式的組,它真的讓我很難。REGEXP_SUBSTR找到組

我已經經歷了許多SO答案,還有Oracle文檔,但似乎正則表達式是我的弱點。

基本上,我想是讓$E[ ]#$D[ ]#之間 我已經寫了成功驗證整個字符串的模式^(\$E\[([A-Z|a-z|0-9|_]+)\]#)((\$D\[(.)*\]#)?)$的文字,但我無法找到該組以這種模式

我試着下面的查詢:

SELECT 
     REGEXP_SUBSTR('$E[some_key]#$D[some value]#',pattern, 1) AS MATCH1, 
     REGEXP_SUBSTR('$E[some_key]#$D[some value]#',pattern, 2) AS MATCH2 
    FROM DUAL; 

我已經試過功能REGEXP_SUBSTR('some text','pattern above', 1)和讓我整個字符串的第四個參數的許多變化,也試過REGEXP_SUBSTR('some text','pattern above', 1, 1),但得到的SA我的結果,要麼是全字符串要麼是NULL

回答

2

修改模式:

^(\$E\[([A-Z|a-z|0-9|_]+)\]#)(\$D\[(.*)\]#)?$ 

使用REGEXP_REPLACE with back reference(適用於Oracle 10g中):

SELECT 
    REGEXP_REPLACE('$E[some_key]#$D[some value]#',pattern, '\2') AS MATCH1, 
    REGEXP_REPLACE('$E[some_key]#$D[some value]#',pattern, '\4') AS MATCH2 
FROM DUAL; 

:Oracle數據庫11g中,您可以這樣做:

SELECT 
    REGEXP_SUBSTR('$E[some_key]#$D[some value]#',pattern, 1,1,null,2) AS MATCH1, 
    REGEXP_SUBSTR('$E[some_key]#$D[some value]#',pattern, 1,1,null,4) AS MATCH2 
FROM DUAL; 

文檔:http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions138.htm

+0

真的很不錯 - 我的+1。 – 2014-09-10 10:31:05

1

嘗試這種模式(僅11克):

\$(D|E)\[([^]]*) 

與此查詢:

SELECT 
    REGEXP_SUBSTR('$E[some_key]#$D[some value]#',pattern, 1, 1, null, 2) AS MATCH1, 
    REGEXP_SUBSTR('$E[some_key]#$D[some value]#',pattern, 1, 2, null, 2) AS MATCH2 
FROM DUAL; 

這將讓你和「第二次出現的「第二子表達式的第一次出現」第二個子表達式「where」第二個子表達式「是指與模式中第二組括號相匹配的內容。

+0

我的朋友,REGEXP_SUBSTR需要兩個或四個參數,參見[oracle文檔](http://docs.oracle.com/cd/B12037_01/server.101/b10759/functions116.htm),另外,我試過了您提供的模式,它匹配** $ E [第一個字符**或** $ D [第一個字符** – simsim 2014-09-10 09:41:43

+0

根據[此oracle文檔](http://docs.oracle.com/cd/B28359_01/ server.111/b28286/functions138.htm)它需要六個參數 - 至少對於版本11g。你跑哪個版本? – 2014-09-10 09:48:17

+0

好的 - 所以我想你運行10克 - 我會盡力爲你找到另一種解決方案。 – 2014-09-10 09:52:29