Мне нужен общий шаблон для использования в нескольких ситуациях с использованием regexp_substr между некоторыми разделителями.

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

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

Поделимся несколькими примерами:

Нить:

Lorem ipsum dolor sit amet, consectetur, end adipiscing elit, -sed- do 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;

person Marcio Matias    schedule 07.02.2019    source источник


Ответы (2)


Функция регулярных выражений 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).

Демо

person Tim Biegeleisen    schedule 07.02.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() вернет исходную строку, если шаблон не найден.

person Gary_W    schedule 07.02.2019