我无法找到我的模式组,这真的让我很难过。
我已经通过了许多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 。
答案 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;
这将使您第一次出现第二个子表达式"第二个子表达式"第二次出现"其中"第二个子表达"指的是与模式中第二组括号匹配的内容。