Мне нужно универсальный шаблон для использования в нескольких ситуациях, используя 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()
вернет исходную строку, если шаблон не найден.