Oracle 正则表达式提取第一对 < 和 > 括号之间的字符串

Oracle regex to extract string between first pair of < and > brackets

我被分配了一个任务来解析一个字符串(本质上是 XML 格式),我需要提取字符串中第一个标签的名称

例如:字符串'<column><data-type>string</data-type>.............''<filter><condition>....</condition>...............' 或者

'......................'

字符串不断变化,但我只对第一个标签感兴趣,我想获得如下输出:

我已经尝试了 regexp_substr(string,'^<(.+)>',1,1,null,1) 和一些类似的变体,但它们似乎并没有始终如一地工作。

请帮忙。

您正在寻找边界之间的 任何 个字符 -- 包括 '>'。因此,只需排除终止符:

select regexp_substr(string,'^<([^>]+)>',1,1,null,1)
from (select '<column><data-type>string</data-type>.............' as string from dual union all
      select '<filter><condition>....</condition>...............' from dual
     ) x;

如果您有 XML 数据,则使用适当的 XML 解析器:

SELECT XMLQUERY( '/*/name()' PASSING XMLTYPE(value) RETURNING CONTENT ) AS tag_name
FROM   table_name

其中示例数据:

CREATE TABLE table_name ( value CLOB );

INSERT INTO table_name ( value )
SELECT '<column><data-type>string</data-type></column>' FROM DUAL UNION ALL
SELECT '<filter><condition>....</condition></filter>' FROM DUAL UNION ALL
SELECT '<query />' FROM DUAL UNION ALL
SELECT '<has_attributes attr1="do not return this" attr2="&lt;or&gt; this" />' FROM DUAL

输出:

| TAG_NAME       |
| :------------- |
| column         |
| filter         |
| query          |
| has_attributes |

db<>fiddle here