我正在尝试拆分一个具有两个复合和嵌套分隔符的字符串:
- 1级:
~|
- 2级:
^|
问题是正则表达式模式适用于单个分隔符,例如: ~
或|
,或者它也适用于复合分隔符,如 ~~
或 ^^
,但它不适用于上述分隔符。
目标字符串:
*~~36415^^Description^^Version-4~~70450^^Description2^^Version-4~~73110^^Description3^^Version-4~~73140*
使用的正则表达式:* [^(~|)]*
* [^(~|)]*
* ((?!((~)(|))).)
* (?!(~|).)
但它没有用。但是,当我将目标字符串更改为:
36415^^MRI Orbit, Face, Neck W W/O Contrast^^CPT-4~~70450^^MRI Orbit, Face, Neck W W/O Contrast^^CPT-4~~73110^^MRI Orbit, Face, Neck W W/O Contrast^^CPT-4~~73140
并使用正则表达式:* [^(~~)]*
* [^(^^)]*
它有效。
PS:我用 https://regex101.com/r/Stbwxt/1 来测试这个。
WITH String_splits AS (
SELECT TRIM(',' FROM REGEXP_SUBSTR('~|36415^|Description^|Version-4~|70450^|Description2^|Version-4~|73110^|Description3^|Version-4~|73140', '[^(~|)]*', 1, LEVEL)) String_splits_1
, TRIM(',' FROM REGEXP_SUBSTR('~|36415^|Description^|Version-4~|70450^|Description2^|Version-4~|73110^|Description3^|Version-4~|73140', '[^(~|)]*', 3, LEVEL)) String_splits_2
FROM dual
CONNECT BY LEVEL <= REGEXP_COUNT('~|36415^|Description^|Version-4~|70450^|Description2^|Version-4~|73110^|Description3^|Version-4~|73140', '[^(~|)]*')
)
SELECT String_splits_1
, String_splits_2
FROM String_splits;
我不确定初始输入字符串是什么;我希望这是其中之一。这样的事情有意义吗?这个想法是:用不同的东西(例如分号(替换当前的分隔符,然后将字符串拆分为行。
SQL> with test (col) as
2 (select '~|36415^|Description^|Version-4~|70450^|Description2^|Version-4~|73110^|Description3^|Version-4~|73140'
3 from dual
4 ),
5 t_replaced as
6 (select replace(replace(col, '~|', ';'), '^|', ';') rep
7 from test
8 )
9 select regexp_substr(rep, '[^;]+', 1, level) result
10 from t_replaced
11 connect by level <= regexp_count(rep, ';') + 1;
RESULT
--------------------------------------------------------------------------------
36415
Description
Version-4
70450
Description2
Version-4
73110
Description3
Version-4
73140
11 rows selected.
SQL>
这些多字符分隔符是一个错误,但您仍然可以通过将它们替换为单字符分隔符来使其工作。 如果你分阶段进行,也会更容易一些:
with YourData as ( select '~|36415^|Description^|Version#=4~|70450^|Description2^|Version-4~|73110^|Description3^|Version-4~|73140' str from dual ), escape as ( select replace(replace(replace(replace(str,'#','&sep1;') ,'=','&sep2;') ,'~|','#') ,'^|','=') str from YourData ), recs as ( select replace(regexp_substr(str,'#?([^#]+)',1,level,'',1) ,'&sep1;','#') rec from escape connect by level <= regexp_count(str,'#') ) select replace(regexp_substr(rec,'[^=]+',1,1),'&sep2;','=') val1 , replace(regexp_substr(rec,'[^=]+',1,2),'&sep2;','=') val2 , replace(regexp_substr(rec,'[^=]+',1,3),'&sep2;','=') val3 from recs;
VAL1 |VAL2 |VAL3 :---- |:----------- |:---------36415 |描述 |版本#=470450 |描述2 |版本-473110 |描述3 |版本-473140 |空 |零
db<>在这里小提琴