Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Регулярное выражение и логическое NOT: выбор из текста строк, не удовлетворяющих условию  [new]
Allexy
Member

Откуда:
Сообщений: 153
Есть текст, состоящий из строк. В каждой строке - URL.
Выбрать те строки из текста, которые удовлетворяют заданному условию, несложно, например, как-то так:
... where REGEXP_LIKE(src_field, '(?m)(http://(условие))$')
А вот как задать такое условие, чтобы находились те строки, которые не удовлетворяют условию?
Что-то типа:
... where REGEXP_LIKE(src_field, '(?m)(http://(!условие))$')
Т.е. нужно, чтобы выполнялось условие:
REGEXP_LIKE(...)= NOT условие в регулярном выражении
Вариант с NOT REGEXP_LIKE(...) не подходит, поскольку хочется в регулярном выражении реализовать такую штуку:
...where REGEXP_LIKE(src_field,'(условие1) | (не условие2)')
,
т.е., чтобы используя одно регулярное выражение, можно было получить строки, удовлетворяющие условию1, или не удовлетворяющие условию2.
Ну, или, в конце концов, не удовлетворяющие условию2, но без NOT REGEXP_LIKE(...)

Большое спасибо.
6 сен 10, 17:24    [9392364]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение и логическое NOT: выбор из текста строк, не удовлетворяющих условию  [new]
mmar
Member

Откуда: -)
Сообщений: 391
Allexy,

как-то так
with t as 
(select 'http://ya.ua' c1 from dual
union all
select 'http://google.com' from dual)
select * from t where regexp_like(c1,'(.+\.ru)|[^.+\.com]$')
6 сен 10, 17:30    [9392437]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение и логическое NOT: выбор из текста строк, не удовлетворяющих условию  [new]
Allexy
Member

Откуда:
Сообщений: 153
mmar,
Спасибо, но:
with t as 
(select 'http://ya.ua' c1 from dual
union all
select 'http://blabla.ru' from dual
union all
select 'http://google.com' from dual)
select * from t where regexp_like(c1,'(.+\.com)|[^.+\.ua]$')
Должно получаться:
1.http://google.com
2.http://blabla.ru
потому как нигде в условиях не определено, вроде бы, что .ru нельзя...
А получается только:
1.http://google.com

Какие еще могут быть варианты?
6 сен 10, 17:47    [9392640]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение и логическое NOT: выбор из текста строк, не удовлетворяющих условию  [new]
Eras
Member

Откуда: Вильнюс
Сообщений: 123
Allexy,

может так
(.+\.(com|ru))|[^.+\.ua]$
6 сен 10, 17:50    [9392669]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение и логическое NOT: выбор из текста строк, не удовлетворяющих условию  [new]
Allexy
Member

Откуда:
Сообщений: 153
Eras,

Спасибо, но хочется, чтобы было:
'(условие1) | (не условие2)'
и Ваш вариант не решает, увы...
Я вот пытался попользовать поиск по условию, конструкцию вида:
'(?(?=если)то|иначе)'
и негативный просмотр:
(?!шаблон)
но, видимо, запутался, и ничего не вышло...
6 сен 10, 17:58    [9392764]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение и логическое NOT: выбор из текста строк, не удовлетворяющих условию  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Allexy,

подумайте в сторону regexp_substr(..) not in (..)
6 сен 10, 18:02    [9392803]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение и логическое NOT: выбор из текста строк, не удовлетворяющих условию  [new]
mmar
Member

Откуда: -)
Сообщений: 391
Allexy,

чето подзабыл регулярки((

следующая попытка:)
select * from t where regexp_like(c1,'(\.com$)|(\.[^ua$])')
6 сен 10, 18:04    [9392832]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение и логическое NOT: выбор из текста строк, не удовлетворяющих условию  [new]
Allexy
Member

Откуда:
Сообщений: 153
... к тому же, дело осложняется тем, что в конструкции:
[^\.com]
исключаются означенные символы, т.е. '.', 'm', 'o' и 'c', но не их последовательность '.com', т.е. условию будут удовлетворять и 'm.oc', и 'cmo.' и т.д.
Увы...
6 сен 10, 18:08    [9392864]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение и логическое NOT: выбор из текста строк, не удовлетворяющих условию  [new]
Allexy
Member

Откуда:
Сообщений: 153
orawish,

regexp_substr(..) not in (..) не подходит, увы, т.к. хочется (нужно!) сделать и проверку на удовлетворение условиям1 и на неудовлетворение условиям2 в одном регулярном выражении (условии).
6 сен 10, 18:12    [9392889]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение и логическое NOT: выбор из текста строк, не удовлетворяющих условию  [new]
OmegaMale
Member

Откуда: воткуда
Сообщений: 201
Allexy,

а почему не сделать двумя регулярными выражениями
WHERE (REGEXP_LIKE () OR NOT REGEXP_LIKE() )?
Мне кажется, что с ростом дерева регулярного выражения сложность растет не линейно...
6 сен 10, 18:17    [9392921]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение и логическое NOT: выбор из текста строк, не удовлетворяющих условию  [new]
Allexy
Member

Откуда:
Сообщений: 153
OmegaMale
Allexy,
а почему не сделать двумя регулярными выражениями...

Двумя - можно и не сложно.
Но надо бы одним. Сами выражения хранятся в базе, структура сложная, логика сложная, не хочется менять... К тому же, не факт, что одно сложное выражение будет работать медленнее, чем два менее сложных... Хотя не факт и то, что быстрее...
Ну и, в конце концов, просто хочется разобраться: неужели предложенную мной задачу в принципе нельзя реализовать в одном регулярном выражении?
6 сен 10, 18:22    [9392945]     Ответить | Цитировать Сообщить модератору
 Re: Регулярное выражение и логическое NOT: выбор из текста строк, не удовлетворяющих условию  [new]
kapelan
Member

Откуда: хутор БольшойБугор
Сообщений: 722
Allexy
[quot OmegaMale].... Сами выражения хранятся в базе, структура сложная, логика сложная, не хочется менять......

думаю ето ключ к Вашей задаче.
По хорошему нужно заточить ети reg_exp к вашим запросам
Но если есть уже отлаженные и много готовых то наверное будет менее геморойно использовать существуюшие
6 сен 10, 21:28    [9393826]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить