Нужно удалить точную группу символов

Мне нужно удалить все символы после определенной строки (-->).

select 
      REGEXP_SUBSTR('-->Team Name - Red-->blue', '[^(-->)]+') 
from dual;

ожидаемый результат приведенного выше запроса: «Название команды — красный». Но возвращается «Имя команды».

Он отфильтровывает все, когда он соответствует любому из символов.


person Sharath Tanish    schedule 10.08.2019    source источник


Ответы (3)


Вы все еще можете использовать Regexp_Substr() аналитическую функцию:

Select Regexp_Substr('-->Team Name - Red-->blue', 
                     '-{2}>(.*?)-{2}>',1,1,null,1) as "Result"
  From dual;

Result
---------------
Team Name - Red

-{2}> ~ ровно дважды встречается - и один раз встречается > например. ( --> )

(.*?) ~ соответствует всему, что ограничено приведенным выше шаблоном

Демо

person Barbaros Özhan    schedule 10.08.2019
comment
Спасибо за ответ. В любом случае, я могу исключить точную группу символов, таких как --› в моем запросе, я фактически использую, как показано ниже REGEXP_SUBSTR( SYS_CONNECT_BY_PATH( MNEMONIC, '-->' ), '[^(-->)]+' ) AS parent_Name Таким образом, мнемонический столбец будет объединен с --›. - person Sharath Tanish; 12.08.2019
comment
пожалуйста @SharathTanish . Что вы получили, когда попробовали таким образом? - person Barbaros Özhan; 12.08.2019
comment
ваше предложение отлично работает в этой ситуации @Barbaros Özhan. Но когда возникает ситуация, когда в данных существует ->, это также обрезает необходимые данные. например: Select Regexp_Substr('-->Team Name - Red->01 --> Team Name - blue->02 --> Team Name - orange->03', '[^>]+[^[:punct:]]') as "Result" From dual; в этом случае ожидается Team Name - Red->01, но возвращается Team Name - Red. - person Sharath Tanish; 12.08.2019

Вы можете попробовать использовать REGEXP_REPLACE здесь с группой захвата:

SELECT
    REGEXP_REPLACE('-->Team Name - Red-->blue', '.*-->(.*?)-->.*', '\1')
FROM dual;

Выход из этого Team Name - Red

Демо

person Tim Biegeleisen    schedule 10.08.2019
comment
Спасибо за ответ @Tim Biegeleisen, но я хочу добиться этого с помощью REGEXP_SUBSTR. - person Sharath Tanish; 12.08.2019
comment
@SharathTanish Каково ваше отвращение к использованию REGEXP_SUBSTR? Я имею в виду, что мы могли просто использовать базовые строковые функции, такие как INSTR, но это потребовало бы больше кода и было бы более уродливым, чем мой ответ. - person Tim Biegeleisen; 12.08.2019

Похоже, вы действительно хотите вернуть строку между двумя отметками -->. Старый добрый вариант substr + instr будет

SQL> with test (col) as
  2    (select '-->Team Name - Red-->blue' from dual)
  3  select substr(col,
  4                instr(col, '-->', 1, 1) + 3,
  5                instr(col, '-->', 1, 2) - instr(col, '-->', 1, 1) - 3
  6               ) result
  7  from test;

RESULT
---------------
Team Name - Red

SQL>
person Littlefoot    schedule 10.08.2019
comment
Спасибо за ответ @Littlefoot, но я хочу добиться этого с помощью REGEXP_SUBSTR. - person Sharath Tanish; 12.08.2019
comment
Пожалуйста. Обратите внимание, что это, вероятно, будет работать НАМНОГО быстрее (чем регулярные выражения), если вы имеете дело с большим набором данных. - person Littlefoot; 12.08.2019