Sql REGEXP\u SUBSTR查找组

Sql REGEXP\u SUBSTR查找组,sql,regex,oracle,oracle10g,Sql,Regex,Oracle,Oracle10g,我无法找到我的模式的组,这真的给了我一段艰难的时间 我已经阅读了很多答案,还有Oracle文档,但正则表达式似乎是我的弱点 基本上,我想要得到的是介于$E[].和$D[]. 我已经编写了模式^(\$E\[([A-Z | A-Z | 0-9 | | |+)\]))(\$D\[(.*]#]?)$,它成功地验证了整个字符串,但我无法在该模式中找到组 我尝试了以下查询: SELECT REGEXP_SUBSTR('$E[some_key]#$D[some value]#',patt

我无法找到我的模式的组,这真的给了我一段艰难的时间

我已经阅读了很多答案,还有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 over',1)
,它为我提供了完整的字符串,也尝试了
REGEXP_SUBSTR('some text','pattern over',1,1)
,但得到了相同的结果,要么是完整的字符串,要么是空的。

尝试这个模式(仅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, 2, null, 2) AS MATCH2
FROM DUAL;
这将得到“第二个子表达式的第一次出现”和“第二个子表达式的第二次出现”,其中“第二个子表达式”指的是与模式中第二组括号相匹配的内容。

修改模式:

^(\$E\[([A-Z|a-z|0-9|_]+)\]#)(\$D\[(.*)\]#)?$
使用(适用于Oracle 10g):

在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;

文档:

我的朋友,REGEXP\u SUBSTR接受两个或四个参数,请参见,我也尝试了您提供的模式,它匹配$E[第一个字符或$D][第一个字符根据它需要六个参数-至少对于版本11g而言。您运行的是什么版本?好的-所以我猜您运行的是10g-我将尝试为您找到另一个解决方案。您的实际源字符串是否包含需要忽略的其他信息-除了$E[]和$D[]?不,只是一个看起来像这样的字符串
$E[someText]#$D[some value]#
和$D[…]#部分是可选的,我也不介意通过
REGEXP\u REPLACE
使用另一个模式仅匹配输入字符串的所需部分,但我也面临同样的问题,很好-+1。
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;
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;