Как сделать отрицательный вывод в 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]|$)');