Sql 如何在Oracle中从正则表达式中提取组?
我得到了这个查询,希望提取括号之间的值Sql 如何在Oracle中从正则表达式中提取组?,sql,oracle,Sql,Oracle,我得到了这个查询,希望提取括号之间的值 select de_desc, regexp_substr(de_desc, '\[(.+)\]', 1) from DATABASE where col_name like '[%]'; 但是,它给了我一个带有括号的值,比如[TEST]。我只想参加考试。如何修改查询以获取它?REGEXP_SUBSTR函数的第三个参数指示示例中目标字符串de_desc中要开始搜索的位置。假设在字符串的给定部分找到匹配项,则不会影响返回的内容 在Oracle11g中,函数
select de_desc, regexp_substr(de_desc, '\[(.+)\]', 1)
from DATABASE
where col_name like '[%]';
但是,它给了我一个带有括号的值,比如[TEST]。我只想参加考试。如何修改查询以获取它?REGEXP_SUBSTR函数的第三个参数指示示例中目标字符串de_desc中要开始搜索的位置。假设在字符串的给定部分找到匹配项,则不会影响返回的内容 在Oracle11g中,函数有第六个参数,我认为这就是您试图使用的参数,它指示您希望返回的捕获组。正确使用的一个例子是:
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从结果的两端删除括号。您需要进行替换,并使用与整个字符串匹配的正则表达式模式
select regexp_replace(de_desc, '.*\[(.+)\].*', '\1') from DATABASE;
IMHO这是最简单、易于记忆、更灵活的方法,因此也是最好的方法。我要提醒任何使用REGEXP_REPLACE获取捕获组的人,如果模式不匹配,Oracle将返回整个值,而您可能希望它返回null。例如,REGEXP\u REPLACE'abcdefghi'、'.\[.+\].'.'\1'模式不匹配返回abcdefghi。这让我有一次绊倒了。这里的问题是Oracle regexp没有提供一个函数来返回与捕获组匹配的字符串部分。您可以尝试使用递归查询选择。。。从选项卡连接方式。。。但要注意潜在的性能问题。令人惊讶的是,Oracle的官方REGEXP_SUBSTR文档中没有提到第6个参数。感谢您指出它的存在。看起来google会带您访问REGEXP_SUBSTR的旧文档,但是如果您能够找到11g文档,您可以看到第6个参数: