Подтвердить что ты не робот

Как извлечь группу из регулярного выражения в Oracle?

Я получил этот запрос и хочу извлечь значение между скобками.

select de_desc, regexp_substr(de_desc, '\[(.+)\]', 1)
from DATABASE
where col_name like '[%]';

Однако это дает мне значение с помощью скобок, таких как "[TEST]". Я просто хочу "ТЕСТ". Как изменить запрос, чтобы получить его?

4b9b3361

Ответ 1

Третий параметр функции REGEXP_SUBSTR указывает позицию в целевой строке (de_desc в вашем примере), где вы хотите начать поиск. Предполагая, что совпадение найдено в заданной части строки, это не влияет на то, что возвращается.

В Oracle 11g есть шестой параметр функции, который, я думаю, и есть то, что вы пытаетесь использовать, который указывает группу захвата, которую вы хотите вернуть. Пример правильного использования будет:

SELECT regexp_substr('abc[def]ghi', '\[(.+)\]', 1,1,NULL,1) from dual;

Где последний параметр 1 указывает номер группы захвата, которую вы хотите вернуть. Вот ссылка на документацию, которая описывает параметр.

10g, кажется, не имеет этой опции, но в вашем случае вы можете достичь того же результата с:

select substr( match, 2, length(match)-2 ) from (
SELECT regexp_substr('abc[def]ghi', '\[(.+)\]') match FROM dual
);

так как вы знаете, что у совпадения будет ровно один лишний символ в начале и конце. (В качестве альтернативы вы можете использовать RTRIM и LTRIM для удаления скобок с обоих концов результата.)

Ответ 2

Вам нужно выполнить замену и использовать шаблон регулярного выражения, соответствующий всей строке.

select regexp_replace(de_desc, '.*\[(.+)\].*', '\1') from DATABASE;