помогите с REGEXP_LIKE

R@mon
Дата: 30.11.2009 13:55:43
Всем день добрый!
Помогите написать условие, нет больше сил...
Есть строка: '50.1.12 45.21 60.24.1'
которая разделена одним знаком пробела на "блоки".
Условия:
1. первая цифра первого блока должна быть с 01 по 99. Причем не 1 а именно 01.
2. второе число блока с 1 по 99 (может быть и 1,2,3)
3. третье как и второе
4. блоков может быть неопределенное количество.
5. последний блок завершает строку.
Задача очень похожа на задачу проверки ip-адресса, но у меня не получилось освоить.
делал примерно так:
select * from (
select 1 id,    '5000000000.1 45.21.1 601.24.11'        a   from dual union all
select 2 id,    '99'      a   from dual union all
select 3 id,    '608'      a   from dual union all
select 4 id,    '50.1.5'        a   from dual union all
select 5 id,    '50.1.5 70.1 89.90.0'        a   from dual union all
select 6 id,    '9'      a   from dual 
)WHERE  REGEXP_LIKE (a,'^[0-9]{2}(\.[0-9]{1,2}){0,2}$');
_Alex_SMIRNOV_
Дата: 30.11.2009 14:22:14
select * from (
select 1 id,    '5000000000.1 45.21.1 601.24.11'        a   from dual union all
select 2 id,    '99'      a   from dual union all
select 3 id,    '608'      a   from dual union all
select 4 id,    '50.1.5'        a   from dual union all
select 5 id,    '50.1.5 70.1.3 89.90.0'        a   from dual union ALL
select 5 id,    '50.1.5 70.1 89.90.0'        a   from dual union all
select 6 id,    '9'      a   from dual 
)
WHERE REGEXP_LIKE (a,'^([0-9]{2}\.[0-9]{1,2}\.[0-9]{1,2} *)+$');
Elic
Дата: 30.11.2009 14:27:15
regexp_like(a||' ','^(\d\d(\.\d\d?){0,2} )+$')
Но RTFM, ибо {0,2} в ТЗ не раскрыто :)
Elic
Дата: 30.11.2009 14:29:42
_Alex_SMIRNOV_, тщательней:
'11.11.1111.11.1111.11.11'
suPPLer
Дата: 30.11.2009 14:31:25
_Alex_SMIRNOV_
select * from (
select 1 id,    '5000000000.1 45.21.1 601.24.11'        a   from dual union all
select 2 id,    '99'      a   from dual union all
select 3 id,    '608'      a   from dual union all
select 4 id,    '50.1.5'        a   from dual union all
select 5 id,    '50.1.5 70.1.3 89.90.0'        a   from dual union ALL
select 5 id,    '50.1.5 70.1 89.90.0'        a   from dual union all
select 6 id,    '9'      a   from dual 
)
WHERE REGEXP_LIKE (a,'^([0-9]{2}\.[0-9]{1,2}\.[0-9]{1,2} *)+$');


Ваш вариант съест и несколько пробелов между блоками. Вот только нужно ли это?

with t as (
select 1 id,    '5000000000.1 45.21.1 601.24.11'        a   from dual union all
select 2 id,    '99'      a   from dual union all
select 3 id,    '608'      a   from dual union all
select 4 id,    '50.1.5'        a   from dual union all
select 5 id,    '50.1.5 70.1.3 89.90.0'        a   from dual union ALL
select 5 id,    '50.1.5   70.1.3    89.90.0'        a   from dual union ALL
select 5 id,    '50.1.5 70.1 89.90.0'        a   from dual union all
select 6 id,    '9'      a   from dual 
)
select * from t
WHERE REGEXP_LIKE (a || ' ','^(\d{2}(\.\d{1,2}){2} )+$');
_Alex_SMIRNOV_
Дата: 30.11.2009 14:44:15
Elic
_Alex_SMIRNOV_, тщательней:
'11.11.1111.11.1111.11.11'

Спасибо за замечание...
тогда вот так, и я добавил еще trim на случай если строка начинается или заканчивается на пробел:
select * from (
select 3 id,    '11.11.11 '      a   from dual UNION ALL
select 3 id,    '11.11.11.11.11.11'      a   from dual 
)
WHERE REGEXP_LIKE (trim(a)|| ' ','^([0-9]{2}\.[0-9]{1,2}\.[0-9]{1,2} )+$');
suPPLer
Дата: 30.11.2009 14:52:56
_Alex_SMIRNOV_
я добавил еще trim на случай если строка начинается или заканчивается на пробел


Насчёт "начинается" пока неопределённость, но что касается "заканчивается":

R@mon
5. последний блок завершает строку.
_Alex_SMIRNOV_
Дата: 30.11.2009 14:55:12
suPPLer
_Alex_SMIRNOV_
я добавил еще trim на случай если строка начинается или заканчивается на пробел


Насчёт "начинается" пока неопределённость, но что касается "заканчивается":

R@mon
5. последний блок завершает строку.


будем считать это дополнительной перестраховкой
romanshegro
Дата: 30.11.2009 15:10:53
Всем большое спасибо!
R@mon
Дата: 30.11.2009 15:17:19
Я немного доработав тестирую следующий вариант:
REGEXP_LIKE (trim(a)|| ' ','^([0-9]{2}(\.[0-9]{1,2}(\.[0-9]{1,2})?)? )+$');
Таким образом хочу обработать условие что в блоке может быть только первое число ИЛИ первое со вторым ИЛИ первое со вторым и третьем. Может здесь закрались страшные баги!? подскажите где..