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

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

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

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

Строка:

Lorem Ipsum Dolor Sit Amet, Concetetur, End Adipiscing Elit, Ssed-Do EiusMod Tempor Incididunt U Labore et Dolore Excp 123456 Великая Аликва 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 ответа

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

демонстрация

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

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

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

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

Другие вопросы по тегам