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

Hen*_*hiu 55 sql oracle

我得到了这个查询,想要提取括号之间的值.

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

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

Dav*_*sta 90

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

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

SELECT regexp_substr('abc[def]ghi', '\[(.+)\]', 1,1,NULL,1) from dual;
Run Code Online (Sandbox Code Playgroud)

最后一个参数1指示要返回的捕获组的编号.以下是描述参数的文档的链接.

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

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

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

  • 令人惊讶的是,Oracle官方的REGEXP_SUBSTR文档中没有提到第6个参数.谢谢你指出它存在. (5认同)
  • 看起来谷歌会带你去 REGEXP_SUBSTR 的旧文档,但是如果你能够找到 11g 文档,你可以看到第 6 个参数:https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions138 .htm#SQLRF06303 (4认同)

iva*_*tpr 24

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

select regexp_replace(de_desc, '.*\[(.+)\].*', '\1') from DATABASE;
Run Code Online (Sandbox Code Playgroud)

  • 我会提醒使用`REGEXP_REPLACE`的任何人获取捕获组,如果模式不匹配,Oracle将返回整个值,而您可能想要的行为是返回`null`.例如,`REGEXP_REPLACE('abcdefghi','.*\[(.+)\].*','\ 1')`(模式不匹配)返回`abcdefghi`.这让我绊倒了一次. (10认同)
  • 恕我直言,这是最简单、容易记住、更灵活的方法,因此也是最好的方法。 (2认同)