2017-08-29 130 views
0

我有一个字符串,如mystr = 'value1~|~value2~|~ ... valuen"。我需要它作为一个列的行分离是这样的:Regexp_substr查找字符串与一组字符不匹配

value1 
value2 
... 
valuen 

我想这

select regexp_substr(mystr, '[^(~\|~)]', 1 , lvl) from dual, (select level as lvl from dual connect by level <= 5); 

的问题是,~|~不随地视为一个组,如果我添加到〜它被分开的字符串;也()被视为分隔符。

任何帮助,高度赞赏!谢谢! 〜|〜

+0

存储这样的值不是一个好主意。阅读关于规范化 – Jens

+0

值不会像这样存储。这只是一个简单的例子。 –

回答

0

快速和肮脏的解决方案:

with t as (
select rtrim(regexp_substr('value1~|~value2~|~value3~|~value4', '(.+?)($|~\|~)', 1,level,''),'~|~')value from dual connect by level<10 
) select * from t where value is not null; 
+0

这个工程!非常感谢你! –

0

[]表示一个字符匹配和[^]表示一个字符不匹配任何包含的字符。

所以[^(~\|~)]将匹配任何一个字符不是(~\|~(再次)或)

你需要的是由您的分离终止的比赛:

SELECT REGEXP_SUBSTR(
     mystr, 
     '(.*?)(~\|~)', 
     1, 
     LEVEL, 
     NULL, 
     1 
     ) 
FROM DUAL 
CONNECT BY LEVEL < REGEXP_COUNT(mystr, '(.*?)(~\|~)'); 

(或者,如果你不能拥有零宽度匹配,你可以使用CONNECT BY子句中的正则表达式'(.+?)(~\|~)'<=。 )

0

这将解析分隔列表,正则表达式的格式将处理NULL列表元素,如果它们出现,如示例中所示。

SQL> with tbl(str) as (
     select 'value1~|~value2~|~~|~value4' from dual 
    ) 
    select regexp_substr(str, '(.*?)(~\|~|$)', 1, level, NULL, 1) parsed 
    from tbl 
    connect by level <= regexp_count(str, '~\|~')+1; 

PARSED 
-------------------------------- 
value1 
value2 

value4 

SQL>