Можем ли мы исключить совпадение с несколькими строками в oracle regexp_like()?

Основные знания:

  1. Мы не можем использовать (?!) для исключения, так как regexp_like() не поддерживает отрицательный просмотр вперед.
  2. Я не хочу исключать использование «NOT REGEXP_LIKE()»
  3. [^] может инвертировать только один символ, но не строку

Вопрос:

Интересно узнать, есть ли у нас альтернатива изменению самого регулярного выражения, передаваемого в oracle regexp_like().

Пример сценария для объяснения:

Regexp - "СТАНДАРТ.*ВРЕМЯ" при использовании в regexp_like() будет соответствовать всем часовым поясам, содержащим слова СТАНДАРТ и ВРЕМЯ. Скажем, я хочу исключить «ИНДИЙСКОЕ СТАНДАРТНОЕ ВРЕМЯ», «АТЛАНТИЧЕСКОЕ СТАНДАРТНОЕ ВРЕМЯ», «ИРЛАНДСКОЕ СТАНДАРТНОЕ ВРЕМЯ» из соответствующих часовых поясов.


person user2907301    schedule 04.12.2017    source источник
comment
Почему бы не использовать НЕ?   -  person Gary_W    schedule 05.12.2017


Ответы (1)


Мне было бы интересно узнать, почему использование «НЕ» не может быть и речи. Но если вы ищете решение для регулярных выражений для удовольствия, я не думаю, что REGEXP_LIKE будет работать, поскольку вариант Oracle не поддерживает отрицательный прогноз. Однако, если подумать немного нестандартно и зная, что REGEX_REPLACE возвращает NULL, если шаблон не найден, вы можете сделать что-то вроде этого (хотя то, что вы можете, не означает, что вы должны это делать, и я бы использовал NOT с REGEXP_LIKE):

SQL> with tbl(str) as (
     select 'INDIAN STANDARD TIME' from dual union all
     select 'ATLANTIC STANDARD TIME' from dual union all
     select 'IRISH STANDARD TIME' from dual union all
     select 'EASTERN STANDARD TIME' from dual union all
     select 'PST STANDARD TIME' from dual union all
     select 'CST STANDARD TIME' from dual
   )
   select str
   from tbl
   where str = regexp_replace(str, '^(INDIAN|ATLANTIC|IRISH) STANDARD.*TIME', 'DO NOT WANT THESE');

STR
----------------------
EASTERN STANDARD TIME
PST STANDARD TIME
CST STANDARD TIME

SQL>

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

select str
from tbl
where NOT regexp_like(str, '^(INDIAN|ATLANTIC|IRISH) STANDARD.*TIME');
person Gary_W    schedule 05.12.2017