Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Регулярные выражения Oracle / 25 сообщений из 26, страница 1 из 2
02.03.2017, 13:51
    #39413116
EvilArcher1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
добрый день
подскажите, пожалуйста как написать регулярное выражение для Oracle 11g, которое бы искало ровно 6 одинаковых цифр подряд?

Например, оно должно найти строки: '9999990' или '0999999', но не должно найти '9999999'
...
Рейтинг: 0 / 0
02.03.2017, 14:01
    #39413131
EvilArcher1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
пробовал "([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
02.03.2017, 14:22
    #39413150
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
EvilArcher1,

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

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

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

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

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

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

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

если вы имели в виду нечто вида ([0-9])\1{5}[^\1], то это не работает, т.к. внутри [^] все символы воспринимаются сами по себе (т.е. как '\' и '1') и не получается исключить найденный повторяющийся символ.
...
Рейтинг: 0 / 0
02.03.2017, 16:03
    #39413210
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
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
02.03.2017, 17:12
    #39413289
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
может быть что-то вроде

Код: plsql
1.
Where 6 = Length(regexp_substr(m,'(0+)|(1+)|(2+)|(4+)|(5+)|(6+)|(7+)|(3+)|(8+)|(9+)' )) 
...
Рейтинг: 0 / 0
02.03.2017, 19:26
    #39413339
Jafa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
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
02.03.2017, 19:29
    #39413340
Jafa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
подправил

Код: 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
02.03.2017, 20:56
    #39413363
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
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
02.03.2017, 21:26
    #39413376
Jafa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
Stax..он не знает что ето будут 9-ки

.....
stax
а что, добавить условие для всех чисел это так сложно?
...
Рейтинг: 0 / 0
03.03.2017, 06:24
    #39413457
EvilArcher1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
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
03.03.2017, 18:12
    #39413897
Alexander_Ttl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
Может не сработать:
Код: 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
03.03.2017, 18:34
    #39413907
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
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
03.03.2017, 18:58
    #39413921
Alexander_Ttl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
6 девяток подряд попадают под шаблон, значит, строка должна выводиться, но 7 идущих подряд нулей не дают.
...
Рейтинг: 0 / 0
03.03.2017, 23:18
    #39413980
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
Регулярные выражения 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
04.03.2017, 12:05
    #39414053
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
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
04.03.2017, 12:07
    #39414055
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
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
04.03.2017, 15:38
    #39414087
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
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
04.03.2017, 20:41
    #39414159
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
Тупое решение в лоб...
Код: 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
04.03.2017, 21:10
    #39414161
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
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
04.03.2017, 21:13
    #39414162
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Регулярные выражения Oracle
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 [игнор отключен] [закрыт для гостей] / Регулярные выражения Oracle / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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