我尝试在Splitting string into multiple rows in Oracle处使用此问题并将其调整为我的需要,但是我对正则表达式不是很自信,也无法通过搜索来解决它。
当前,该问题使用大量的regex_substr来回答,依此类推,使用[^,]+
作为模式,以便将其分隔为一个逗号。我需要用一个多字符定界符(例如#;
)对其进行拆分,但是该正则表达式模式会匹配任何单个字符以将其拆分出来,以便在其他地方存在#
或;
的地方导致分裂的文本。
我已经确定模式(#;+)
将与#;
的每个组匹配,但是我无法锻炼如何像上面那样将其反转以将行分成多个。
我确定我只是缺少一些简单的东西,所以我们将不胜感激!
答案 0 :(得分:0)
我认为您应该使用:
[^#;+]+
代替
(#;+)
作为,它将检查范围内可以是#的任何字符;或+,然后您可以进行相应的拆分。
您可以根据需要进行更改,但是在正则表达式中 共享,我认为
#
,;
和+
是定界符
因此,最后,查询将如下所示:
with tbl(str) as (
select ' My, Delimiter# Hello My; Delimiter World My Delimiter My Delimiter test My Delimiter ' from dual
)
SELECT LEVEL AS element,
REGEXP_SUBSTR( str ,'([^#;+]+)', 1, LEVEL, NULL, 1 ) AS element_value
FROM tbl
CONNECT BY LEVEL <= regexp_count(str, '[#;+]')+1\\
输出:
ELEMENT ELEMENT_VALUE
1 My, Delimiter
2 Hello My
3 Delimiter World My Delimiter My Delimiter test My Deli
-编辑-
如果您要检查无限数量的#
或;
进行拆分,并且不想一次拆分,我发现了以下正则表达式,但是Oracle也不支持
(?:(?:(?![;#]+).#(?![;#]+).|(?![;#]+).;(?![;#]+).|(?![;#]+).)*)+
因此,我发现除了下面的查询之外,如果在两个定界符之间只有一个这样的实例,该查询就不会分裂:
select ' My, Delimiter;# Hello My Delimiter ;;# World My Delimiter ; My Delimiter test#; My Delimiter ' from dual
)
SELECT LEVEL AS element,
REGEXP_SUBSTR( str ,'([^#;]+#?[^#;]+;?[^#;]+)', 1, LEVEL, NULL, 1 ) AS element_value
FROM tbl
CONNECT BY LEVEL <= regexp_count(str, '[#;]{2,}')+1\\
输出:
ELEMENT ELEMENT_VALUE
1 My, Delimiter
2 Hello My Delimiter
3 World My Delimiter ; My Delimiter test
4 My Delimiter