如何在Oracle中从正则expression式中提取组?

我得到了这个查询,并想提取括号内的值。

select de_desc, regexp_substr(de_desc, '\[(.+)\]', 1) from DATABASE where col_name like '[%]'; 

然而,它给了我与括号如“[testing]”的价值。 我只是想“testing”。 我如何修改查询来获取它?

REGEXP_SUBSTR函数的第三个参数表示目标string(在您的示例中为de_desc )中您想要开始search的位置。 假设在string的给定部分find匹配,它不会影响返回的内容。

在Oracle 11g中,函数有第六个参数,我想是你正在使用的,它表示你想要返回的捕获组。 正确使用的一个例子是:

 SELECT regexp_substr('abc[def]ghi', '\[(.+)\]', 1,1,NULL,1) from dual; 

最后一个参数1表示要返回的捕获组的编号。

10g似乎没有这个选项,但在你的情况下,你可以达到相同的结果:

 select substr( match, 2, length(match)-2 ) from ( SELECT regexp_substr('abc[def]ghi', '\[(.+)\]') match FROM dual ); 

因为你知道一场比赛在开始和结束时只会有一个多余的字符。 (或者,可以使用RTRIM和LTRIM从结果的两端删除括号。)

你需要做一个replace,并使用匹配整个string的正则expression式模式。

 select regexp_replace(de_desc, '.*\[(.+)\].*', '\1') from DATABASE;