Sql 如何使用REGEX_SUBSTR

Sql 如何使用REGEX_SUBSTR,sql,regex,oracle,Sql,Regex,Oracle,我需要从一个长字符串中提取一个子字符串。我尝试了以下查询,但不起作用,它返回NULL, 我想提取和之间的第一个值12 我得到了一个结果,罗西,但我也想消除,还有什么建议吗?你可以使用 看 [^使用括号中包含的匹配组的子表达式来获取所需内容: SELECT REGEXP_SUBSTR('<CC>3</CC><CN>ROSSI</CN><NO>MARIO</NO><IN>VIA DELLE MIMOSE 4</

我需要从一个长字符串中提取一个子字符串。我尝试了以下查询,但不起作用,它返回NULL, 我想提取和之间的第一个值12

我得到了一个结果,罗西,但我也想消除,还有什么建议吗?

你可以使用


[^使用括号中包含的匹配组的子表达式来获取所需内容:

SELECT REGEXP_SUBSTR('<CC>3</CC><CN>ROSSI</CN><NO>MARIO</NO><IN>VIA DELLE MIMOSE 4</IN>',
                     '<CN>(.*?)</CN>', 1, 1, NULL, 1) 
  FROM DUAL;
在这里,我们告诉REGEXP\u SUBSTR,我们要匹配一个字符串,该字符串以开头,后跟任意字符数的子表达式。*,并在找到时结束。因为只有一个子表达式。*?在正则表达式中,它是子表达式1,由传递给REGEXP\u SUBSTR的最后一个参数指示博韦


不要使用正则表达式解析XML数据;请使用适当的XML解析器:

选择t* 从XMLTABLE “/root” 传递XMLTYPE ||“3玫瑰含羞草4” || 柱 抄送编号路径“./cc”, cn VARCHAR220路径“/cn”, 无VARCHAR220路径'./无', 在VARCHAR250路径中“/IN” T 哪些产出:


dbfiddle

如果输入中有另一个标记,那么这将不起作用。好的-因此使子表达式不贪婪。修复了答案,并更改了fiddle,以显示如果数据中有多个,原始贪婪子表达式将无法按预期工作,当然,这不是OP显示的,但我是game:-,以及如何使用一个非贪婪的子表达式让它再次快乐起来。当然,它不会捕获第二对和后续的几对,但由于我们离原始问题有点远,我们将把这个问题的解决方案留给有动机的读者作为练习。:-如果CN元素包含嵌套的标记,如ROSSI,这将不匹配任何内容。@MT0标记OP Show不是嵌套的。否则,Oracle中没有任何正则表达式可以提供帮助,我也不会共享此解决方案。很好的一个+1,我想知道为什么人们将XML存储/视为字符串。这不符合目的!使用适当的XML解析器+1,只是-以世界上所有好的名字!-下面的查询是什么?请提供您的代码。
select regexp_substr('<CC>3</CC><CN>ROSSI</CN><NO>MARIO</NO><IN>VIA DELLE MIMOSE 4</IN>','<CN>([^<]*)</CN>', 1, 1, NULL, 1)
SELECT REGEXP_SUBSTR('<CC>3</CC><CN>ROSSI</CN><NO>MARIO</NO><IN>VIA DELLE MIMOSE 4</IN>',
                     '<CN>(.*?)</CN>', 1, 1, NULL, 1) 
  FROM DUAL;
CC | CN | NO | IN -: | :---- | :---- | :----------------- 3 | ROSSI | MARIO | VIA DELLE MIMOSE 4