通过多字符定界符Oracle将单行字符串拆分为多行

时间:2018-07-22 13:21:50

标签: regex string oracle split

我尝试在Splitting string into multiple rows in Oracle处使用此问题并将其调整为我的需要,但是我对正则表达式不是很自信,也无法通过搜索来解决它。

当前,该问题使用大量的regex_substr来回答,依此类推,使用[^,]+作为模式,以便将其分隔为一个逗号。我需要用一个多字符定界符(例如#;)对其进行拆分,但是该正则表达式模式会匹配任何单个字符以将其拆分出来,以便在其他地方存在#;的地方导致分裂的文本。

我已经确定模式(#;+)将与#;的每个组匹配,但是我无法锻炼如何像上面那样将其反转以将行分成多个。

我确定我只是缺少一些简单的东西,所以我们将不胜感激!

1 个答案:

答案 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