Regexp_like(), oracle, разбор строк

Рейтинг: 1Ответов: 2Опубликовано: 17.11.2014

Добрый день, господа!

Есть таблица:

id     value
-------------------------------------------
1      some words xxxxx-xxxx more words
2      awesome words xxxxx-xxxx more words

Нужно найти все awesome words (регистр и позиция словосочетания произвольная, но порядок всегда железен (может быть AwesOme woRds, например)), в которых отсутствуют числовые подстроки вида xxxxx-xxxx (xxxx-xxxx, xxxxx-xxxx, xxxxxх-xxxx (4-6 цифр перед тире 4 всегда после)). Символьные и числовые подстроки могут меняться местами.

Либо у меня что-то не так с SQL Dev, либо я просто нуб...
Для поиска числовых подстрок написал такое (а мне-то, наоборот, выкинуть надо совпадающие подстроки):

regexp_like(value, '([\d]{4,6})-([\d]{4})')

Вроде ищет, но когда:

regexp_like(value, '!([\d]{4,6})-([\d]{4})')

Тоже ищет и не выпиливает совпадения... WTF?

Помогите составить грамотное выражение! Спасибо!

Ответы

▲ 1Принят

Так пробовали?

select * from tab
where not regexp_like(value, '([\d]{4,6})-([\d]{4})');
▲ 2

В python бы прокатило [^(\d{4,6}-\d{4})]* с модификатором g.

Насчет твоего случая могу сказать только, что надо лезть в дебри sql. Регулярки сами по себе не умеют пропускать или исключать чего-либо из текста. Для этого существуют специальные методы.


http://regex101.com/r/oG5yP0/1