URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9149
[ Назад ]

Исходное сообщение
"Регулярное выражения для проверки попадания в диапазон"

Отправлено Aplei , 30-Май-11 22:51 
Имеется номер телефона в формате 7495123456789, имеется диапазон номеров провайдера А: 74951230000-74951249999.

Как написать именно через регулярное выражение проверку попадает ли номер в данный диапазон или нет?


Содержание

Сообщения в этом обсуждении
"Регулярное выражения для проверки попадания в диапазон"
Отправлено Aplei , 30-Май-11 22:52 
> Имеется номер телефона в формате 7495123456789, имеется диапазон номеров провайдера А:
> 74951230000-74951249999.
> Как написать именно через регулярное выражение проверку попадает ли номер в данный
> диапазон или нет?

Дополню, что диапазоны могут быть "кривыми" : на примере короткого 456-523


"Регулярное выражения для проверки попадания в диапазон"
Отправлено Etch , 31-Май-11 03:40 
>> Имеется номер телефона в формате 7495123456789, имеется диапазон номеров провайдера А:
>> 74951230000-74951249999.
>> Как написать именно через регулярное выражение проверку попадает ли номер в данный
>> диапазон или нет?
> Дополню, что диапазоны могут быть "кривыми" : на примере короткого 456-523

/^(74951)?2[34]\d{4}$/ -- это если номер без знаков тире. Тире можно всунуть если заранее знать его местонахождение, а если оно в любом месте может попасться, то хз.


"Регулярное выражения для проверки попадания в диапазон"
Отправлено Aplei , 31-Май-11 06:56 
>>> Имеется номер телефона в формате 7495123456789, имеется диапазон номеров провайдера А:
>>> 74951230000-74951249999.
>>> Как написать именно через регулярное выражение проверку попадает ли номер в данный
>>> диапазон или нет?
>> Дополню, что диапазоны могут быть "кривыми" : на примере короткого 456-523
> /^(74951)?2[34]\d{4}$/ -- это если номер без знаков тире. Тире можно всунуть если
> заранее знать его местонахождение, а если оно в любом месте может
> попасться, то хз.

не совсем то имел ввиду. Вопрос в том, как составить регексп для проверки попадания числа в диапазон. Данный регексп работает только для указанного случая, а если диапазон будет
74951230000-74951241234 ?


"Регулярное выражения для проверки попадания в диапазон"
Отправлено Andrey Mitrofanov , 31-Май-11 09:53 
> не совсем то имел ввиду. Вопрос в том, как составить регексп для
> проверки попадания числа в диапазон. Данный регексп работает только для указанного
> случая, а если диапазон будет
> 74951230000-74951241234 ?

Децкий сад...

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

0/ 74951230000-74951241234

1/
"^749512" 30000-41234
. 30000-39999 | 40000-41234
. "3[0-9]{4}" | "4" 0000-1234
. . 0000-0999 | 1000-1234
. . "0[0-9]{3}|1" 000-234
. . . . . . . . . . . . . . . . . . . Э, гм! Ну, скажем Полуект!

"^749512(3[0-9]{4}|4(0[0-9]{3}|1( Лениво мне! 000-234 )))$"


"Регулярное выражения для проверки попадания в диапазон"
Отправлено Andrey Mitrofanov , 31-Май-11 10:21 
>> не совсем то имел ввиду. Вопрос в том, как составить регексп для
>> проверки попадания числа в диапазон. Данный регексп работает только для указанного
>> случая, а если диапазон будет
>> 74951230000-74951241234 ?
> Децкий сад...
> Разбивать на диапазоны, которые успешно накрываются регекспами, регекспы для поддиапахзонов
> объединять через "или", потом, возможно оптимизировать, если делать нечего и если
> вообще возможно.

Кстати, я ленив (и провёл много часов над длиииииными регекспами), поэтому -

> "^749512" 30000-41234
>  . 30000-39999 | 40000-41234
>  . "3[0-9]{4}" | "4" 0000-1234
>  . . 0000-0999 | 1000-1234
>  . . "0[0-9]{3}|1" 000-234

- "оптимизировал" [одним из способов, общие первиксы за скобки выносил] _сразу_.

Если следовать декларированной метОде, то:


1/ 74951230000-74951241234

2/
74951230000-74951239999
74951240000-74951240999
74951241000-74951241199
74951241200-74951241229
74951241230-74951241234

3/
"7495123" 0000-9999
"74951240" 000-999
"74951241" 000-199
"749512412" 00-29
"7495124123" 0-4

4/
"7495123[0-9]{4}"
"74951240[0-9]{3}"
"74951241[01][0-9]{2}"
"749512412[0-2][0-9]"
"7495124123[0-4]"

5/
"^("
"7495123[0-9]{4}|74951240[0-9]{3}|74951241[01][0-9]{2}|749512412[0-2][0-9]|7495124123[0-4]"
")$"

6/
"^(749512("
"3[0-9]{4}|40[0-9]{3}|41[01][0-9]{2}|412[0-2][0-9]|4123[0-4]"
")$"

7/
"^(749512(3[0-9]{4}|40[0-9]{3}|41[01][0-9]{2}|412[0-2][0-9]|4123[0-4])$"

.....
Как-то так. Там есть местами пересекающиеся суффиксы, но ловить там нечего - только время тратить.


"Регулярное выражения для проверки попадания в диапазон"
Отправлено Aplei , 31-Май-11 10:51 
>[оверквотинг удален]
> ")$"
> 6/
> "^(749512("
> "3[0-9]{4}|40[0-9]{3}|41[01][0-9]{2}|412[0-2][0-9]|4123[0-4]"
> ")$"
> 7/
> "^(749512(3[0-9]{4}|40[0-9]{3}|41[01][0-9]{2}|412[0-2][0-9]|4123[0-4])$"
> .....
> Как-то так. Там есть местами пересекающиеся суффиксы, но ловить там нечего -
> только время тратить.

ок, методику понял, спасибо.


"Регулярное выражения для проверки попадания в диапазон"
Отправлено rur , 31-Май-11 09:57 
>>>> Имеется номер телефона в формате 7495123456789, имеется диапазон номеров провайдера А:
>>>> 74951230000-74951249999.
> не совсем то имел ввиду. Вопрос в том, как составить регексп для
> проверки попадания числа в диапазон. Данный регексп работает только для указанного
> случая, а если диапазон будет
> 74951230000-74951241234 ?

Попадание в диапазон - **арифметическое** свойство, а не символьное. Поэтому проверять
надо так: if(7495123456789 >= 74951230000 && 7495123456789 <= 74951241234 ) "то ОК".

Регексом такое сделать видимо не получится... Я бы посмотрел, если кто попробует.



"Регулярное выражения для проверки попадания в диапазон"
Отправлено Andrey Mitrofanov , 31-Май-11 10:08 
> **арифметическое** свойство, а не символьное.

Отмазки? Зачем это тут? :-P

> Я бы посмотрел, если кто попробует.

Ну, посмотри сообщением выше... Делов-то.


"Регулярное выражения для проверки попадания в диапазон"
Отправлено sm00th1980 , 31-Май-11 10:49 
>> **арифметическое** свойство, а не символьное.
> Отмазки? Зачем это тут? :-P
>> Я бы посмотрел, если кто попробует.
> Ну, посмотри сообщением выше... Делов-то.

а теперь подумай сколько ты написал строк кода через REGEXP-ы для этой задачи - с тем что теме предложили через арифметику?

И задумайся над тем что через пару месяцев тебе придётся вернуться к этому коду и что-то исправить....


"Регулярное выражения для"
Отправлено Andrey Mitrofanov , 31-Май-11 11:00 
> а теперь подумай сколько ты написал строк кода через REGEXP-ы для этой
> задачи - с тем что теме предложили через арифметику?

Ну, на работе и не такой унылой фигнёй занимаюсь. :-P

> И задумайся над тем что через пару месяцев тебе придётся вернуться к
> этому коду и что-то исправить....

Ты ещё открой дискуссию, GPL или BSDL больше подходит для лицензтрования "арифметических" регекспов. :-j

Я не предлагал _так_ писать _код_, да ещё в "продакшене". Я вполне себе [почти] алгоритмически решил поставленную задачу. Препод нашего _студента_ будет доволен.

Если бы школьники знали, что такое регекспы, была бы вполне себе олимпиадная задачка для 7-8-9 класса... А так взрослые дядьки сотрясают алгоритчическую %) пустоту.


"Регулярное выражения для"
Отправлено rur , 31-Май-11 11:10 
>> а теперь подумай сколько ты написал строк кода через REGEXP-ы для этой
>> задачи - с тем что теме предложили через арифметику?

-- Ну, да, можно сравнивать по разрядам... Еще можно раскрыть диапазон и
сформировать массив телефонов, потом проверить, есть ли такой телефон в массиве?
А что, и память компа не будет простаивать!

Любую задачу можно решить сколь угодно сложно. -- аксиома, однако! :-)  



"Регулярное выражения для"
Отправлено sm00th1980 , 31-Май-11 15:41 
>>> а теперь подумай сколько ты написал строк кода через REGEXP-ы для этой
>>> задачи - с тем что теме предложили через арифметику?
> -- Ну, да, можно сравнивать по разрядам... Еще можно раскрыть диапазон и
> сформировать массив телефонов, потом проверить, есть ли такой телефон в массиве?
> А что, и память компа не будет простаивать!
> Любую задачу можно решить сколь угодно сложно. -- аксиома, однако! :-)

to rur:
поддерживаю Коллега :)

Как говорилось не мной:
"если у вас есть проблема и вы решили использовать регулярки - то теперь у вас ДВЕ проблемы"


"Регулярное выражения для"
Отправлено Aplei , 31-Май-11 11:12 
>[оверквотинг удален]
>> И задумайся над тем что через пару месяцев тебе придётся вернуться к
>> этому коду и что-то исправить....
> Ты ещё открой дискуссию, GPL или BSDL больше подходит для лицензтрования "арифметических"
> регекспов. :-j
> Я не предлагал _так_ писать _код_, да ещё в "продакшене". Я вполне
> себе [почти] алгоритмически решил поставленную задачу. Препод нашего _студента_ будет
> доволен.
> Если бы школьники знали, что такое регекспы, была бы вполне себе олимпиадная
> задачка для 7-8-9 класса... А так взрослые дядьки сотрясают алгоритчическую %)
> пустоту.

эх если бы так просто. Вот как раз такие "олимпиадники" понапишут биллингов, где нумерация задается ТОЛЬКО регекспом, а директора заключат договоры с 100500 войппровайдерами, где Новосибирск, к примеру, диапазонами покрошен как оливье!


"Регулярное выражения для"
Отправлено sm00th1980 , 31-Май-11 15:46 
to Aplei:
> эх если бы так просто. Вот как раз такие "олимпиадники" понапишут биллингов,
> где нумерация задается ТОЛЬКО регекспом, а директора заключат договоры с 100500
> войппровайдерами, где Новосибирск, к примеру, диапазонами покрошен как оливье!

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

Доводы:
1) крайне сложный - без пол-литра не разберёшься
2) тормозной по определению - мы же с символами работаем
3) хз скока скрытых подводных камней имеется в каждой регулярке :) без сотни другой unit-test-ов ОДНО такое выражение не покрыть - а следовательно там всегда будут потенциальные баги... что как бы для биллинга мягко говоря крайне не желательно...

это всего лишь моё ИМХО - не принимайте близко к сердцу если что.