Мне нужно универсальный шаблон для использования в нескольких ситуациях, используя regexp_substr между некоторыми разделителями - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь определить некоторые шаблоны для извлечения данных из Oracle, используя REGEXP_SUBSTR, но мне не хватает способа удалить разделители, используемые для поиска данных.

Мне нужен один шаблон для извлечения любого видаданные между двумя разделителями, но без учета этих разделителей в результате.

Давайте поделимся некоторыми примерами:

Строка:

Lorem ipsum dolor sit amet, consectetur, end adipiscing elit,-sed- сделать eiusmod tempor incididunt ut labore et dolore excp 123456 magna aliqua 789003.

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

1 - consectetur (without space and without comma)
2 - adipiscing (without words 'end', 'elit' and without space character)
3 - sed (without '-' character)
4 - labore (between space, using part of word in a sentence like lab*)
5 - 123456 (between 'excp ' and ' magna', without return space character)
6 - 789003 (without '.' dot character)

with example as
 (select 'Lorem ipsum dolor sit amet, consectetur, end adipiscing elit, - 
sed- do eiusmod tempor incididunt ut labore et dolore excp 123456 magna 
aliqua 789003.' as string from dual) 
    select string,
        regexp_substr(string,'(amet\, ).*(\, end)')          as val1,  -- 
Expect ==> 'consectetur'
        regexp_substr(string,'(end ).+(elit)')               as val2,  -- 
Expect ==> 'adipiscing'
        regexp_substr(string,'(-).*(-)')                     as val3,  -- 
Expect ==> 'sed'
        regexp_substr(string,'(ut ).*( et)')                 as val4,  -- 
Expect ==> 'dolore'
       regexp_substr(string,'excp +[[:digit:]]+( magna)')   as val5,  -- 
Expect ==> '123456'
        regexp_substr(string,'(\S)+[[:digit:]]+(\.)')        as val6   -- 
Expect ==> '789003'
  from  example;

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Ради аргумента, REGEXP_SUBSTR() поддерживает группы захвата при вызове следующим образом (возможно, это было обновлено в 11g?):

regexp_substr(string,'amet, (.*), end', 1, 1, NULL, 1) as val1,  -- Expect ==> 'consectetur'

Аргументы означают начало в позиции 1, ищитепервое совпадение строкового шаблона регулярного выражения, без модификаторов (хотя вы можете использовать 'i' для учета регистра без учета регистра) и вернуть первую группу захвата.Он возвращает 'consectetur', как и ожидалось.

Важное отличие, на которое следует обратить внимание: REGEXP_SUBSTR() вернет NULL, если шаблон не найден, а REGEXP_REPLACE() вернет исходную строку, если шаблон не найден.,

0 голосов
/ 07 февраля 2019

Функция регулярного выражения Oracle, которая может быть более полезной / мощной, - это REGEXP_REPLACE, поскольку она поддерживает группы захвата.Это означает, что мы можем написать шаблон, который может включать части, которые мы на самом деле не хотим видеть в конечном результате.

Я остановлюсь на одном из ваших вопросов:

5 - 123456 (between 'excp ' and ' magna', without return space character)

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

.*(^|\s)excp (\d+) magna(\s|$).*

Затем мы можем заменить на вторую группу захвата, которая является числом 123456:

SELECT
    REGEXP_REPLACE(text, '.*(^|\s)excp (\d+) magna(\s|$).*', '\2') AS output
FROM yourTable;

(^|\s) и(\s|$) служат эффективными границами слова (обычно пишутся с использованием \b в других вариантах регулярных выражений).Это гарантирует, что мы сопоставляем только полные слова excp и magna, а не эти слова как подстроки других слов (например, magnate).

Demo

...