База данных Oracle, извлечение строки между двумя другими строками - PullRequest
0 голосов
/ 31 января 2019

Мне нужно регулярное выражение, которое в сочетании с regexp_substr () даст мне слово, находящееся между двумя другими указанными словами.

Пример :

source_string => 'First Middle Last'

    substring varchar2(100);
    substring := regexp_substr(source_string, 'First (.*) Last'); <=== 

это не работает: (.

dbms_output.put_line(substring) ===> вывод должен быть: 'Middle'

Я знаю, это выглядит просто иЕсли честно, вначале я думал так же, но теперь, потратив около 3 часов на поиск решения, я сдаюсь ...

Ответы [ 3 ]

0 голосов
/ 31 января 2019
Шаблон

(\S*) может использоваться с regexp_replace и regexp_substr, как показано ниже для получения среднего слова:

with t(str) as
(
 select 'First Middle Last' from dual
)
select regexp_substr(trim(regexp_replace(str, '^(\S*)', '')),'(\S*)') 
    as "Result String"
  from t;

Result String
-------------
Middle    

на первом шаге First и на второмодно Last слов обрезается.

Или, более прямо вы можете выяснить, используя regexp_replace как

with t(str) as
(
 select 'First Middle Last' from dual
)
select regexp_replace(str,'(.*) (.*) (.*)','\2') 
    as "Result String"
  from t;

Result String
-------------
Middle    
0 голосов
/ 31 января 2019

Если исходная строка всегда выглядит одинаково, то есть состоит из 3 элементов (слов), то такое простое регулярное выражение делает свою работу:

SQL> with t (str) as
  2    (select 'First Middle Last' from dual)
  3  select regexp_substr(str, '\w+', 1, 2) result from t;

RESULT
------
Middle

SQL>
0 голосов
/ 31 января 2019

Это не работает, потому что ищутся литеральные строки 'First' и 'Last'.Предполагая, что строки не все буквально начинаются 'First', вам нужно найти другой способ их представления.Вы уже сделали это, представив 'Middle' как (.*)

Следующий момент заключается в том, что вам нужно извлечь подвыражение (часть в скобках), это шестой параметр REGEXP_SUBSTR().

Если вы сложите их вместе, то следующее даст вам то, что вы хотите:

regexp_substr(source_string, '.*\s(.*)\s.*', 1, 1, 'i', 1)

Пример работы:

SQL> select regexp_substr('first middle last', '.*\s(.*)\s.*', 1, 1, 'i', 1)
  2    from dual;

REGEXP
------
middle

Вы также можете использовать онлайн-тестер регулярных выражений для проверки того, что 'middle' является единственной захваченной группой .

В зависимости от того, как выглядят ваши фактические исходные строки, вы, возможно, не захотите искать точнопробелы, но вместо этого используйте \W ( несловесный символ ).

Если вы ожидаете ровно три слова, я бы также привязал ваше выражение к началу и концустрока: ^.*\s(.*)\s.*$

...