无法使用 oracle 正则表达式在带有管道的复合分隔符上进行拆分



我正在尝试拆分一个具有两个复合和嵌套分隔符的字符串:

  • 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<>在这里小提琴

最新更新