Невозможно использовать регулярное выражение оракула для разделения на составной разделитель с трубкой - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь разбить строку, имеющую два составных и вложенных разделителя:

  • Уровень 1: ~|
  • Уровень 2: ^|

Проблема в том, что шаблон регулярного выражения работает с одним разделителем, таким как: ~ или |, или он также работает с составным разделителем, таким как ~~ или ^^, но он не работает свышеуказанные разделители.

Целевая строка:

*~~36415^^Description^^Version-4~~70450^^Description2^^Version-4~~73110^^Description3^^Version-4~~73140*

Используемое регулярное выражение: * [^(~|)]* * [^(~\|)]* * ((?!((~)(\|))).) * (?!(~\|).)

Но это не такт работа.Однако, когда я изменил свою Target String на:

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;

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Я не уверен, какова начальная строка ввода;Я надеюсь, что это тогда будет .Будет ли что-то подобное иметь смысл?Идея такова: заменить текущие разделители чем-то другим (например, точкой с запятой), а затем разбить строку на строки.

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>
0 голосов
/ 13 апреля 2019

Эти многосимвольные разделители являются ошибкой, но вы все равно можете заставить их работать, заменив их односимвольными разделителями.Также немного проще, если вы делаете это поэтапно:

    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 | Description  | Version#=4
70450 | Description2 | Version-4 
73110 | Description3 | Version-4 
73140 | <em>null</em>         | <em>null</em>      

db <> fiddle здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...