Это не работает, потому что ищутся литеральные строки '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.*$