PL / SQL разделить строку по шаблону - PullRequest
0 голосов
/ 01 июня 2018

Аналогично этому вопросу ...

Как я могу использовать регулярное выражение для разделения строки, используя строку в качестве разделителя?

... I 'm пытается разделить следующую строку:

Spent 30 CAD in movie tickets at Cineplex on 2018-06-01

Мой желаемый вывод такой:

ELEMENT ELEMENT_VALUE
------- -------------
      1 Spent
      2 30
      3 CAD
      4 movie tickets
      5 Cineplex
      6 2018-06-01

Аналогично, он должен уметь обрабатывать:

Paid 600 EUR to Electric Company

Производство:

ELEMENT ELEMENT_VALUE
------- -------------
      1 Paid
      2 600
      3 EUR
      4 
      5 Electric Company

Я пробовал это регулярное выражение безрезультатно:

(\w+)(\D+)(\w+)(?(?=in)(\w+)(at)(\w+)(on)(.?$)|((?=to)(\w+)(.?$)))

Я без особого везения просмотрел несколько сайтов с регулярными выражениями и этот пост:

Извлечь часть текста, разделенную разделителем, с помощью регулярных выражений

Может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Есть две проблемы с требуемым выводом.Во-первых, как определить токены, которые вы хотите исключить («on», «at» и т. Д.).Второй - как игнорировать пробел в определенных токенах («Электрическая компания», «билеты в кино»).

Достаточно просто решить пункт один с помощью двухэтапного процесса.Шаг # 1 разбивает строку на пробелы, шаг # 2 удаляет нежелательные токены:

with exclude as (
  select 'in' as tkn from dual union all
  select 'at' as tkn from dual union all
  select 'to' as tkn from dual union all
  select 'on' as tkn from dual 
  )
  , str as (
    select id
           , level as element_order
           , regexp_substr(txt, '[^ ]+', 1, level) as tkn
    from t23
    where id = 10
    CONNECT BY level <= regexp_count(txt, '[^ ]+')+1
    and id = prior id
    and prior sys_guid() is not null
    )
 select row_number() over (partition by str.id order by str.element_order) as element
       , str.tkn as element_value
 from str
      left join exclude on exclude.tkn = str.tkn
 where exclude.tkn is null
 and str.tkn is not null
 ;

Вот Демонстрация SQL Fiddle .

Второй момент довольнотрудно решить.Полагаю, вам понадобится еще одна справочная таблица для идентификации звонящих, и, возможно, используйте listagg() для их объединения.

0 голосов
/ 01 июня 2018

Вот простой токенайзер SQL, который разбивается на пробел:

select regexp_substr('Spent 30 CAD in movie tickets at Cineplex on 2018-06-01','[^ ]+', 1, level) from dual
connect by regexp_substr('Spent 30 CAD in movie tickets at Cineplex on 2018-06-01', '[^ ]+', 1, level) is not null

From: https://blogs.oracle.com/aramamoo/how-to-split-comma-separated-string-and-pass-to-in-clause-of-select-statement

...