2014-09-10 43 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