Regexp_substr найти строку, не соответствующую группе символов

У меня есть строка как 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);

Проблема в том, что ~|~ не рассматривается как группа, если я добавляю ~ в любое место строки, она разделяется; Кроме того () рассматриваются как разделители.

Любая помощь высоко ценится! Спасибо! ~|~

3 ответа

[] означает совпадение одного символа и [^] обозначает один символ, который не соответствует ни одному из содержащихся символов.

Так [^(~\|~)] будет соответствовать любой символ, который не ( или же ~ или же \ или же | или же ~ (снова) или ),

То, что вы хотите, это совпадение, которое заканчивается вашим разделителем:

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>

Быстрое и грязное решение:

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;
Другие вопросы по тегам