powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / regexp подстроки в произвольном порядке
26 сообщений из 26, показаны все 2 страниц
regexp подстроки в произвольном порядке
    #39562048
подскажите,
можно в регулярке проверить вхождение всех подстрок одновременно , но в произвольном порядке ?

с соблющением порядка- это понятно
по типу regexp_replace('сегодня была конфа по оракл интересно очень','сегодн.{1,}инт')

а в беспорядке, но обязательное вхождение одновременно всех подстрок


что-то не нашел

или в какую сторону смотреть хотя б, как соорудить поисковый запрос ?
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562053
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДобрыйМаксили в какую сторону смотреть хотя б, как соорудить поисковый запрос ?
В сторону regexp_substr(...) AND regexp_substr(...) AND ...
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562055
regexp_replace - это не "проверить", это "заменить".
Для проверки самый простой способ - это несколько регэкспов.
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562057
andrey_anonymousДобрыйМаксили в какую сторону смотреть хотя б, как соорудить поисковый запрос ?
В сторону regexp_substr(...) AND regexp_substr(...) AND ...

количество подстрок и сами подстроки- из настроек, то есть вещь динамическая. Только динамическим скл ?

пичаль :(
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562059
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо динамики я бы прикрутил group by.
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562061
AmKadВместо динамики я бы прикрутил group by.

можно подробнее ?
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562064
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДобрыйМаксAmKadВместо динамики я бы прикрутил group by.

можно подробнее ?Если задача звучит как "проверить", то проджойнить исходную строку с множеством искомых вхождений и взять group by. И вхождение искать не regexp-ом, а like-ом.
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562065
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДобрыйМаксможно в регулярке проверить вхождение всех подстрок одновременно , но в произвольном порядке ?

Уже возникала подобная тема, если не одним вызовом, то можно. Одним - оракловая реализация регулярок не позволяет.
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562066
AmKad,
ээ.. что-то плохо представляю, но сейчас попробую что-нибудь такое сделать. Мож в процессе дойдет
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562073
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДобрыйМакс,

шутки для, забавы ради

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with reg as (
  select '^(М|м|M)(и|u)лл(и|u)(0|o|о)н' s from dual union all
  select '\s(p|P|р|Р)(о|0|o)(з|3)$' from dual union all
  select '\s\w+лы(x|х)' from dual
),
reg_cnt as (
  select count(*) cnt_match from reg
),
t as (
  select 'Muлли0н наглых р03' str from dual union all
  select 'миллион алых наглых роз' from dual
)
select str
from t, reg, reg_cnt
group by str
having sum(case when regexp_count(str,s) = 1 then 1 else 0 end) = max(cnt_match)
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562103
AmKadВместо динамики я бы прикрутил group by.Типа такого?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with
str as
 (select 'сегодня была конфа по оракл интересно очень' s
    from dual
  union all
  select 'сегодня была конфа по оракл лажа полная' s
    from dual),
chk as
 (select column_value v, count(*) over() cnt from table(sys.odcivarchar2list('сегодн', 'инт', 'была')))

select str.s, count(*) || ' из ' || chk.cnt info1, listagg(chk.v, ', ') within group(order by chk.v) info2
  from str
  left join chk
    on instr(str.s, chk.v) > 0
 group by str.s, chk.cnt

S                                           INFO1  INFO2
------------------------------------------- ------ -----------------
сегодня была конфа по оракл лажа полная     2 из 3 была, сегодн
сегодня была конфа по оракл интересно очень 3 из 3 была, инт, сегодн
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562111
пример с group bycount(*) || ' из ' || chk.cntТут ошибся :(
Криво для 0 вхождений.
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562113
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример с group byТипа такого?Нет. Что-то вроде того, что привел env.
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562117
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadпример с group byТипа такого?Нет. Что-то вроде того, что привел env.Хотя да, у тебя по сути тот же самый принцип.
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562121
пример с group byпример с group bycount(*) || ' из ' || chk.cntТут ошибся :(
Криво для 0 вхождений.Починил
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with
str as
 (select 'сегодня была конфа по оракл интересно очень' s from dual union all
  select 'сегодня была конфа по оракл лажа полная' s from dual union all
  select 'а вчера конфу пропустил :(' s from dual),
chk as
 (select column_value v from table(sys.odcivarchar2list('сегодн', 'инт', 'была')))
select str.s,
       count(chk.v) || ' из ' || (select count(*) from chk) info1,
       listagg(chk.v, ', ') within group(order by chk.v) info2
  from str
  left join chk
    on instr(str.s, chk.v) > 0
 group by str.s
 order by count(chk.v) desc, str.s

S                                           INFO1  INFO2
------------------------------------------- ------ -----------------
сегодня была конфа по оракл интересно очень 3 из 3 была, инт, сегодн
сегодня была конфа по оракл лажа полная     2 из 3 была, сегодн
а вчера конфу пропустил :(                  0 из 3
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562125
envУже возникала подобная тема, если не одним вызовом, то можно. Одним - оракловая реализация регулярок не позволяет.

Так как ограничение паттерна в регулярке 512b, то это скорее не прикладной вариант, а так чисто поржать, так как больше 3 подстрок не потянет =)

Извращенные времена требуют извращенных мер

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with t as 
(select 'p1' id from dual
union all
select 'p2' from dual 
union all
select 'p3' from dual),
tab as
(select '111p1p2p111' txt from dual
union all
select 'dsfsp2fsdfp2p3p1ds' from dual 
union all
select 'p3p2p1' from dual)

select  * from tab
 where regexp_like(txt,(select '('||listagg(f1,')|(') WITHIN GROUP (order by 1)||')' from (
select sys_connect_by_path('('||id||')','.*') f1
  from t
  where level = (select count(*) from t)
  connect by nocycle prior id is not null)));
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562144
всем спасибо за ответы

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

мог бы сначала запомнить результаты в table of и оттуда селектить. Но из table of разве можно сделать селект так, чтобы не одну колонку в table из varray, а так , что б селект как с полноценной таблицы , отобрать все колонки ?
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562155
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо добавить набор в группировку.
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562187
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ДобрыйМакс,

это разово надо или постоянно и быстро?
Для частых и разных поисков лучше текстовый индекс создать и использовать contains
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562195
Bobby Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderДобрыйМакс,
Для частых и разных поисков лучше текстовый индекс создать и использовать containsС языка снял. =)
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562271
Можно обойтись двумя регекспами. Первым помешиваем к искомым вариантам зависимые инварианты. Вторым проверяем все перестановки инвариантов с помощью уже статического выражения. То есть разбирать и в цикле проходить ни проверяемую строку, ни искомую не нужно.

приблизительно так
Код: plsql
1.
2.
3.
4.
regexp_like(
   regexp_replace(строка, '((словоА)|(словоБ)|(словоВ))','<\2-\3-\4>'), 
   '<--.+>.+(<-.+->.+<.+-->|<.+-->.+<-.+->)|<-.+->.+(<--.+>.+<.+-->|<.+-->.+<--.+>)|<.+-->.+(<-.+->.+<--.+>|<--.+>.+<-.+->)'
)

...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562300
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
баловства ради:
regexp_replace+xmlquery
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with
v as (
  select 'сегодня была конфа по оракл интересно очень' s from dual union all
  select 'сегодня была сегодня конфа по оракл интересно была очень' s from dual union all
  select 'сегодня была конфа по оракл лажа полная' s from dual union all
  select 'а вчера конфу пропустил :(' s from dual)
select
   v.s
  ,xmlquery('count(distinct-values(ora:tokenize(.,",")))' passing regexp_replace(s,'.*?(сегодн|инт|была|$)','\1,') returning content).getnumberval() cnt
from v


regexp_replace+xmltable
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with
v as (
  select 'сегодня была конфа по оракл интересно очень' s from dual union all
  select 'сегодня была сегодня конфа по оракл интересно была очень' s from dual union all
  select 'сегодня была конфа по оракл лажа полная' s from dual union all
  select 'а вчера конфу пропустил :(' s from dual)
select
   v.s
  ,t.cnt
from v
    ,xmltable( 'count(distinct-values(ora:tokenize(.,",")))'
               passing regexp_replace(s,'.*?(сегодн|инт|была|$)','\1,')
               columns cnt varchar2(100) path '.'
     ) t


по идее я б и replace сунул в xmltable, но там у оракла беда - регулярки работают крайне хреново:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> select (column_value).getstringval() x from xmltable('replace("abracadabra", "a.*?(a)", "*$1.")');

X
--------------
*bra.c*da.bra

SQL> select (column_value).getstringval() x from xmltable('replace("abracadabra", "a.*?a", "*$1.")');

X
--------------
*.c*.bra
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562707
скажите, а как бы вы назвали такое решение, удачное или нет :

допустим, есть табличка TAB с наборами подстрок

ккк,ппп,ппо
ddd,ggg,kjk
iii,ghd,rthr

нужно отобрать строки с таблицы BAP, у которых одновременно все подстроки одного из наборов найдены

я бы взял все наборы с подстроками сначала объединил бы в одну строку ('ккк,ппп,ппо,
ddd,ggg,kjk,iii,ghd,rthr'),
сделал полную выборку bulk collect c BAP (в которой найдена строка хотя бы с одной из подстрок), зафигачил в table of,

а затем сделал цикл по TAB , распарсивая каждый отдельный набор подстрок по рекомендация выше и приджойнивая к forall - заполнял бы итоговую временную таблицу с результатами из table of .


норм ?
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562718
xtender,

текстовый индекс не подойдет к сожалению из-за архитектурных особеностей системы
но инфа интересная, почитаю про эти индексы
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562785
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДобрыйМаксскажите, а как бы вы назвали такое решение, удачное или нет :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
with groups_pivot (grp_id, str) as ( -- наборы
select 1, 'ккк,ппп,ппо' from dual union all
select 2, 'ddd,ggg,kjk' from dual union all
select 3, 'iii,ghd,rthr' from dual),

strings (str_id, base_str)      as ( -- проверяемые строки
select 1, 'sss ddd aaa dd' from dual union all
select 2, 'ппп ddd ggg dd' from dual union all
select 3, 'kjk ddd ggg dd' from dual union all
select 4, 'ппп ппо ккк dd' from dual),

group_unpivot as (
select s1.grp_id, s1.str, s2.column_value as sub_str
from groups_pivot s1,
table(select collect(regexp_substr(str, '[^,]+', 1, level)) from dual connect by level <= regexp_count(str, '[^,]+')) s2
)

select str.str_id, str.base_str, grp.grp_id, grp.str
from             strings str
cross join group_unpivot grp
group by str.str_id, str.base_str, grp.grp_id, grp.str
having count(*) = count(nullif(instr(str.base_str, grp.sub_str), 0));

    STR_ID BASE_STR                    GRP_ID STR
---------- ----------------------- ---------- --------------------
         4 ппп ппо ккк dd                   1 ккк,ппп,ппо
         3 kjk ddd ggg dd                   2 ddd,ggg,kjk


Если декартово произведение будет кушать много темпа и тормозить, можно оптимизировать.
...
Рейтинг: 0 / 0
regexp подстроки в произвольном порядке
    #39562882
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
xtenderтам у оракла беда - регулярки работают крайне хреново:c ora:replace() - ok:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with
 v as (
  select 'сегодня была конфа по оракл интересно очень' s from dual union all
  select 'сегодня была сегодня конфа по оракл интересно была очень' s from dual union all
  select 'сегодня была конфа по оракл лажа полная' s from dual union all
  select 'а вчера конфу пропустил :(' s from dual
  )
select 
  *
from v
    ,xmltable( 'count(distinct-values(ora:tokenize(ora:replace($S,concat(".*?(",$R,"|$)"),"\1,"),",")))'
               passing s as S
                      ,'сегодн|инт|была' as R
               columns cnt varchar2(100) path '.'
     ) t

...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / regexp подстроки в произвольном порядке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]