Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Oracle中从正则表达式中提取组?_Sql_Oracle - Fatal编程技术网

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个参数: