Regexp_substr查找字符串与一组字符不匹配
问题描述:
我有一个字符串,如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);
的问题是,~|~
不随地视为一个组,如果我添加到〜它被分开的字符串;也()被视为分隔符。
任何帮助,高度赞赏!谢谢! 〜|〜
答
快速和肮脏的解决方案:
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
这个工程!非常感谢你! –
答
[]
表示一个字符匹配和[^]
表示一个字符不匹配任何包含的字符。
所以[^(~\|~)]
将匹配任何一个字符不是(
或~
或\
或|
或~
(再次)或)
。
你需要的是由您的分离终止的比赛:
SELECT REGEXP_SUBSTR(
mystr,
'(.*?)(~\|~)',
1,
LEVEL,
NULL,
1
)
FROM DUAL
CONNECT BY LEVEL < REGEXP_COUNT(mystr, '(.*?)(~\|~)');
(或者,如果你不能拥有零宽度匹配,你可以使用CONNECT BY
子句中的正则表达式'(.+?)(~\|~)'
和<=
。 )
答
这将解析分隔列表,正则表达式的格式将处理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>
存储这样的值不是一个好主意。阅读关于规范化 – Jens
值不会像这样存储。这只是一个简单的例子。 –