0

我有一个像mystr = 'value1~|~value2~|~ ... valuen". 我需要它作为一列分隔在这样的行上:

value1
value2
...
valuen

我正在尝试这个

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

问题是它~|~不被视为一个组,如果我将 ~ 添加到字符串中的任何位置,它就会被分开;() 也被视为分隔符。

非常感谢任何帮助!谢谢!~|~

4

3 回答 3

0

[]表示单个字符匹配,并[^]表示单个字符不匹配任何包含的字符。

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

您想要的是由分隔符终止的匹配:

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

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

于 2017-08-29T09:13:52.863 回答
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;
于 2017-08-29T07:52:00.517 回答
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>
于 2017-08-29T13:23:38.860 回答