Как сделать отрицательный вывод в oracle regexp_like(), '?!' не работает

Запрос:

select 1 "val" from dual where regexp_like('ITEM HEIGHT','^(?!ICON).*HEIGHT$'); 

Приведенный выше запрос не возвращает меня 1, Пожалуйста, дайте мне знать, как добиться негативного взгляда с помощью оракула regexp_like(),

Примечание: пожалуйста, не предлагайте никаких изменений в запросе, мне интересно знать правильное регулярное выражение, которое принято regexp_like() для негативного взгляда. Также [^], кажется, отрицает только символ за символом, но не всю строку.

2 ответа

Как уже упоминалось, регулярные выражения Oracle напрямую не поддерживают утверждения нулевой ширины.

В некоторых ситуациях вы можете разделить то, что вы пытаетесь проверить, на несколько выражений. Для примера, который вы привели, вы можете сделать что-то вроде этого:

select 1 "val"
 from dual
where NOT regexp_like('ITEM HEIGHT','^ICON')
  and regexp_like('ITEM HEIGHT','HEIGHT$');

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

select 1 "val"
 from dual
where regexp_like('ITEM HEIGHT','^([^I]|I[^C]|IC[^O]|ICO[^N]).*HEIGHT$');

В основном, первая часть этого выражения проверяет, что:

  • первый персонаж не "я"
  • ИЛИ первый символ "Я", но второй символ не "С"
  • ИЛИ первые два символа "IC", но третий символ не "O"
  • ИЛИ первые три символа "ICO", но четвертый символ не "N"

Очевидно, что этот метод может стать громоздким, но в некоторых случаях он все же может быть полезен.

Oracle не поддерживает упреждающий просмотр в регулярных выражениях - вместо этого вы можете просто проверить, что следующий символ не тот, который вы хотите исключить:

select 1 "val"
from   dual
where  regexp_like('ac','a([^b]|$)'); 
Другие вопросы по тегам