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

Например, оно должно найти строки: '9999990' или '0999999', но не должно найти '9999999'
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413131
EvilArcher1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробовал "([0-9])\1{5}", но оно также выполняется и для '9999999'.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with d as(select '([0-9])\1{5}' as p from dual)
select * 
from(
select REGEXP_SUBSTR('9990999999', d.p, 4, 1, 'i', 0) AS T0
from d
union all
select REGEXP_SUBSTR('9999999999', d.p, 4, 1, 'i', 0) AS T0
from d      
union all
select REGEXP_SUBSTR('9999999990', d.p, 4, 1, 'i', 0) AS T0  
from d     
) 
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413150
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvilArcher1,

Когда ты переформулируешь для себя постановку как 6 одинаковых цифр, обрамленных иными символами или концами строк, тогда и регулярку легче будет написать.
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413160
EvilArcher1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

Допустим я нашел символ, который повторяется 6 раз (в моем примере это '9'). Не могу понять как в регулярном выражении указать, что их должны обрамлять иные символы. Я пробовал с помощью конструкции [^], но ничего не вышло. Заранее же не известно, какая цифра будет повторяться в строке.
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413170
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvilArcher1,

Можно через 10 альтернатив выражения для каждой из цифр.

То, есть если тебя надо строго шесть шестерок, то можно записать так
Код: plaintext
where regexp_like(v, '([^6]|^)6{6}([^6]|$)')

Или так (прицепив пробел, чтоб упростить регулярку)
Код: plaintext
where regexp_like(' '||v||' ','[^6]6{6}[^6]')

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

Может кто-от предложит красивее.
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413171
EvilArcher1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иными словами, не понятно как исключить из обрамляющих символов тот, который найден повторяющимся.
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413174
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvilArcher1Иными словами, не понятно как исключить из обрамляющих символов тот, который найден повторяющимся.
а напишите ещё один (исключающий) предекат с ещё одним (исключаемым) регулярным выражением
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413181
EvilArcher1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
orawish,

если вы имели в виду нечто вида ([0-9])\1{5}[^\1], то это не работает, т.к. внутри [^] все символы воспринимаются сами по себе (т.е. как '\' и '1') и не получается исключить найденный повторяющийся символ.
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413210
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvilArcher1orawish,

если вы имели в виду нечто вида ([0-9])\1{5}[^\1], то это не работает, т.к. внутри [^] все символы воспринимаются сами по себе (т.е. как '\' и '1') и не получается исключить найденный повторяющийся символ.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t as (select '99999900' m from dual
     union select '99999991'   from dual
     union select '99999999'   from dual
)
select m from t 
   where regexp_like(m,'([0-9])\1{5}')
 and not regexp_like(m,'([0-9])\1{6}');
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413289
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может быть что-то вроде

Код: plsql
1.
Where 6 = Length(regexp_substr(m,'(0+)|(1+)|(2+)|(4+)|(5+)|(6+)|(7+)|(3+)|(8+)|(9+)' )) 
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413339
Jafa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvilArcher1,
как на счет без регулярных?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with t as (select '99999900' m from dual
     union select '99999991'   from dual
     union select '99999999'   from dual
     union select '09999999'   from dual
     union select '00999999'   from dual
)
select m from t
WHERE INSTR(m, '999999', 1, 2) = 0;
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413340
Jafa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подправил

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t as (select '99999900' m from dual
     union select '99999991'   from dual
     union select '99999999'   from dual
     union select '09999999'   from dual
     union select '00999999'   from dual
     union select '00999'   from dual
)
select m from t
WHERE INSTR(m, '999999', 1, 2) = 0 AND INSTR(m, '999999', 1, 1) > 0;
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413363
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JafaEvilArcher1,
как на счет без регулярных?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with t as (select '99999900' m from dual
     union select '99999991'   from dual
     union select '99999999'   from dual
     union select '09999999'   from dual
     union select '00999999'   from dual
)
select m from t
WHERE INSTR(m, '999999', 1, 2) = 0;



он не знает что ето будут 9-ки

.....
stax
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413376
Jafa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax..он не знает что ето будут 9-ки

.....
stax
а что, добавить условие для всех чисел это так сложно?
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413457
EvilArcher1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
orawish
Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t as (select '99999900' m from dual
     union select '99999991'   from dual
     union select '99999999'   from dual
)
select m from t 
   where regexp_like(m,'([0-9])\1{5}')
 and not regexp_like(m,'([0-9])\1{6}');



Этот вариант выглядит наиболее подходящим. Жаль, что пока не вижу способа по-проще. Спасибо за помощь.
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413897
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может не сработать:
Код: sql
1.
2.
3.
4.
with t as (select '9999990000000' m from dual)
select m from t 
   where regexp_like(m,'([0-9])\1{5}')
 and not regexp_like(m,'([0-9])\1{6}');
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413907
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander_TtlМожет не сработать:
Код: sql
1.
2.
3.
4.
with t as (select '9999990000000' m from dual)
select m from t 
   where regexp_like(m,'([0-9])\1{5}')
 and not regexp_like(m,'([0-9])\1{6}');


поясните, о чём вы..
насколько вижу, всё работает,как заказано
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413921
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
6 девяток подряд попадают под шаблон, значит, строка должна выводиться, но 7 идущих подряд нулей не дают.
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39413980
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Регулярные выражения Oracle не поддерживают lookahead/lookbehind, посему требуется два прохода:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with t as (
           select '99999900' m     from dual union
           select '99999991'       from dual union
           select '99999999'       from dual union
           select '99999900000000' from dual
          )
select  m
  from  t
  where regexp_like(
                    regexp_replace(
                                   m,
                                   '(\d)\1{6,}'
                                  ),
                    '(\d)\1{5}'
                   )
/

M
--------------
99999900
99999900000000

SQL> 



SY.
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39414053
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SY,

не пойдет из-за
Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t as (
           select '99999900' m     from dual union
           select '99999991'       from dual union
           select '99999999'       from dual union
           select '99999900000000' from dual union
           select '999000000009999' from dual
          )
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39414055
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SY,

можно подправить так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with t as (
           select '99999900' m     from dual union all
           select '99999991'       from dual union all
           select '99999999'       from dual union all
           select '99999900000000' from dual union all
           select '999000000009999' from dual
          )
select  m
  from  t
  where regexp_like(
                    regexp_replace(
                                   m,
                                   '((\d)\2*)',
                                   'z\1z'
                                  ),
                    'z(\d)\1{5}z'
                   )
/



А вообще можно и одной регуляркой:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with t as (
           select '99999900' m     from dual union
           select '99999991'       from dual union
           select '99999999'       from dual union
           select '99999900000000' from dual union
           select '999000000009999' from dual
          )
select  m
  from  t
  where regexp_replace(
                       m,
                       '(\d)(\1{6,}|(\1{5}))?'
                       ,'\3'
                      ) is not null
/

...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39414087
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderможно подправить так

Согласен, и не можно а нужно (правда простого z в качестве разделительой replace_string по моему будет достаточно).

xtenderА вообще можно и одной регуляркой



А вот тут несогласен:


Код: 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.
28.
29.
30.
31.
32.
33.
34.
with t as (
           select 'xtender' m     from dual
          )
select  m
  from  t
  where regexp_replace(
                       m,
                       '(\d)(\1{6,}|(\1{5}))?'
                       ,'\3'
                      ) is not null
/

M
-------
xtender

with t as (
           select 'xtender' m     from dual
          )
select  m
  from  t
  where regexp_like(
                    regexp_replace(
                                   m,
                                   '(\d)\1{6,}',
                                   'z'
                                  ),
                    '(\d)\1{5}'
                   )
/

no rows selected

SQL> 




SY.
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39414159
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тупое решение в лоб...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with t(s) as (
           select '99999900'      from dual union
           select '999990900'      from dual union
           select '99999991'       from dual union
           select '99999999'       from dual union
           select '99999900000000' from dual union
           select '999000000009999' from dual
          ),
tt(s,x) as (
select s,
instr(s,'000000')+
instr(s,'111111')+
instr(s,'222222')+
instr(s,'333333')+
instr(s,'444444')+
instr(s,'555555')+
instr(s,'666666')+
instr(s,'777777')+
instr(s,'888888')+
instr(s,'999999')
 from t
)
select s from tt where x > 0
...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39414161
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SYА вот тут несогласен:ну не надо так усложнять, можно проще:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t as (
           select '99999900' m     from dual union
           select '99999991'       from dual union
           select '99999999'       from dual union
           select '99999900000000' from dual union
           select '999000000009999' from dual union 
           select 'xtender' from dual
          )
select  m
  from  t
  where regexp_replace(
                       m,
                       '\D|(\d)(\1{6,}|(\1{5}))?'
                       ,'\3'
                      ) is not null
/

...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39414162
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Vadim Lejnin,

в условиях написано, что больше 6 символов не надо...
выделенные лишние
Код: 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.
28.
29.
30.
31.
32.
33.
SQL> ;
  1  with t(s) as (
  2             select '99999900'      from dual union
  3             select '999990900'      from dual union
  4             select '99999991'       from dual union
  5             select '99999999'       from dual union
  6             select '99999900000000' from dual union
  7             select '999000000009999' from dual
  8            ),
  9  tt(s,x) as (
 10  select s,
 11  instr(s,'000000')+
 12  instr(s,'111111')+
 13  instr(s,'222222')+
 14  instr(s,'333333')+
 15  instr(s,'444444')+
 16  instr(s,'555555')+
 17  instr(s,'666666')+
 18  instr(s,'777777')+
 19  instr(s,'888888')+
 20  instr(s,'999999')
 21   from t
 22  )
 23* select s from tt where x > 0
SQL> /

S
---------------
999000000009999
99999900
99999900000000
99999991
99999999

...
Рейтинг: 0 / 0
Регулярные выражения Oracle
    #39414512
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderSYА вот тут несогласен:ну не надо так усложнять, можно проще:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t as (
           select '99999900' m     from dual union
           select '99999991'       from dual union
           select '99999999'       from dual union
           select '99999900000000' from dual union
           select '999000000009999' from dual union 
           select 'xtender' from dual
          )
select  m
  from  t
  where regexp_replace(
                       m,
                       '\D|(\d)(\1{6,}|(\1{5}))?'
                       ,'\3'
                      ) is not null
/



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


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