REGEXP_SUBSTR查找组

时间:2014-09-10 09:13:14

标签: sql regex oracle oracle10g

我无法找到我的模式组,这真的让我很难过。

我已经通过了许多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)的第4个参数的许多变体,它为我提供了完整的字符串,也尝试了REGEXP_SUBSTR('some text','pattern above', 1, 1),但得到了相同的结果,完整的字符串 NULL

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

尝试这种模式(仅11g):

\$(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;

这将使您第一次出现第二个子表达式"第二个子表达式"第二次出现"其中"第二个子表达"指的是与模式中第二组括号匹配的内容。