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;