如何从Oracle中的正则表达式中提取组?

时间:2011-10-13 18:39:40

标签: sql oracle

我收到了这个查询,想要在括号之间提取值。

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

然而它给了我带括号的值,例如“[TEST]”。我只想要“TEST”。如何修改查询以获取它?

2 个答案:

答案 0 :(得分:85)

REGEXP_SUBSTR函数的第三个参数指示要开始搜索的目标字符串(示例中为de_desc)中的位置。假设在字符串的给定部分中找到匹配,则不会影响返回的内容。

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

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

最后一个参数1表示您想要返回的捕获组的编号。以下是描述参数的文档的link

10g似乎没有此选项,但在您的情况下,您可以通过以下方式获得相同的结果:

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

因为您知道匹配在开头和结尾只有一个多余的字符。 (或者,您可以使用RTRIM和LTRIM从结果的两端删除括号。)

答案 1 :(得分:20)

您需要进行替换并使用与整个字符串匹配的正则表达式模式。

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