регулярное выражение для поиска первого вхождения

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

вход : -

FR_3000 Error opening file [File_Location].  Operating system error message [The system cannot find the path specified.].

выход :-

FR_3000 Error opening file [].  Operating system error message [The system cannot find the path specified.].

Я попробовал запрос ниже, но не смог решить проблему.

select regexp_replace(description,'\[(.*?)\]','') from emp;

person Ranjan Sarkar    schedule 05.04.2017    source источник
comment
Расскажите нам, как это не может решить вашу проблему. Это может быть неправильное регулярное выражение или даже неправильное имя таблицы или столбца.   -  person Adrian Shum    schedule 05.04.2017


Ответы (2)


Регулярные экспресс-функции Redshift не имеют никакого понятия о групповом захвате, поэтому решение не будет иметь чистоты чистого регулярного выражения.

Если вы знаете, что первый экземпляр ']' всегда будет идти после первого экземпляра '[', вы можете использовать:

select left(description, charindex('[', description)) || substring(description, charindex(']', description)) from emp;

Если возможно, что у вас есть случайный ']' в начале вашей строки, вы можете использовать немного менее эффективный:

select left(description, charindex('[', description)) || substring(description, REGEXP_INSTR(description, '\]', charindex('[', description))) from emp;

Что мы делаем в этих утверждениях, так это берем все до первой левой скобки, которая находится в позиции charindex('[', description), и все, что находится после первой правой скобки, которая находится в позиции charindex(']', description), а затем объединяем их с помощью оператора ||.

person Jason Rosendale    schedule 05.04.2017
comment
Спасибо Джейсон!! Это помогло - person Ranjan Sarkar; 06.04.2017

Не уверен, в чем твоя проблема. У меня нет среды, чтобы протестировать это конкретно в Redshift. Я думаю, основываясь на вашем теге, эта замена слишком жадная, поэтому результат становится FR_3000 Error opening file []. ?

Один из способов — заменить

^(.*?)\[.*?\](.*)$

с

\1[]\2

Объяснение

^                   Start of line
 (   )              group 1
  .*?               any number of character, reluctant match 
                    (match at least as possible)
      \[            follow by open square bracket
        .*?         any number of char, reluctant match
           \]       follow by closing square bracket
             (.*)   group 2, of any number of character
                 $  till the end

Пожалуйста, настройте синтаксис в соответствии с красным смещением.

В случае, если красное смещение даже не поддерживает неохотный квантификатор, измените регулярное выражение на что-то вроде:

^([^\[]*)\[[^\]]*\](.*)$

Протестируйте регулярное выражение в https://regex101.com/r/IDEvK3/1.

person Adrian Shum    schedule 05.04.2017