Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.203.85] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте.
Очень-очень долго мучаюсь с проблемой регулярных выражений. Суть в том, что я вообще второй раз ими пользуюсь, а задачка вроде бы и легкая, да только с некоторыми нюансами. Пытаюсь с помощью регулярного выражения определить, правильно ли введен ip-адрес. Перебрал просто кучу вариантов, остановился на таком: "^([01][0-9][0-9]|2[0-4][0-9]|25[0-5])(\.[01][0-9][0-9]|2[0-4][0-9]|25[0-5]){3}$", но оно по каким-то странным причинам некорректно определяет строку. Я не стал заморачиваться с числами и заставил пользователя вводить с ведущими нулями (например, 192.168.000.001), но все равно ни хрена не работает. Насколько мне понятен принцип работы регулярных выражений, сперва мы ищем совпадение по группе ([01][0-9][0-9]|2[0-4][0-9]|25[0-5]), то есть первое трехзначное число; затем три ({3}) раза ищем по форме (\.[01][0-9][0-9]|2[0-4][0-9]|25[0-5]), то есть точку и трехзначное число, не превышающее 255 (например, .176). По идее, любой ip-адрес должен хорошо определяться, но работает весь этот винегрет все равно с какими-то немыслимыми ошибками. Не уверен насчет первой группы ([01][0-9][0-9]|2[0-4][0-9]|25[0-5]), возможно, нужно убрать скобки ("^[01][0-9][0-9]|2[0-4][0-9]|25[0-5](\.[01][0-9][0-9]|2[0-4][0-9]|25[0-5]){3}$"), но тогда (по логике вещей) мы будем разглядывать строку в поисках совпадения либо по правилу [01][0-9][0-9], либо по 2[0-4][0-9], либо по 25[0-5](\.[01][0-9][0-9]|2[0-4][0-9]|25[0-5]){3}. Если кто-нибудь располагает идеями, поделитесь, пожалуйста. Буду очень благодарен. |
Сообщ.
#2
,
|
|
|
C помощью регэкспов определять наличие числа в диапазоне 0..255 - это жестко, имхо.
Напиши просто ^(\d{1,3}\.){3}\d{1,3}$ Впрочем, раз ты можешь напрячь пользователей: Цитата lambdafunction @ то заставь их вводить числа в шестнадцатеричном формате и с ведущими нулями - тогда всё просто будет. и заставил пользователя вводить с ведущими нулями (например, 192.168.000.001) |
Сообщ.
#3
,
|
|
|
Шестнадцатеричные было бы проще обрабатывать, конечно, но (а) программа под винду, и, соответственно, (б) пользователь может вообще не знать, что такое hex.
Проблема решена после трехчасовой долбежки об стол. Результирующее регулярное выражение для проверки ip-адреса таково: "^([0-9]|[0-9][0-9]|[01][0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[0-9][0-9]|[01][0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$". Таким образом, тут сразу же и матчинг, и парсинг. Все красиво, можно паковать. Проверяются сперва первые цифры ip-адреса до точки; а потом три раза точка, а за ней цифры. Работает красиво, пока что ни одной ошибки ни один из тестеров не обнаружил, хотя в их руках ломается все и вся. Надеюсь, что код работать будет исправно и долго. |
Сообщ.
#4
,
|
|
|
КС грамматику лучше напишите, не мучайтесь с regex'пами.
|
Сообщ.
#5
,
|
|
|
В этом случае вообще проще свой компонент создать, который будет отслеживать каждую позицию и править общее значение автоматически. Кстати, вполне вероятно, что такой компонент уже давным-давно есть (под .NET)... Очень даже может быть...
|
Сообщ.
#6
,
|
|
|
Цитата lambdafunction @ Почему именно под .NET? Обычный WinAPI. Называется IP address control, класс окна WC_IPADDRESS, находится в Comctl32.dll начиная с версии 4.71 Кстати, вполне вероятно, что такой компонент уже давным-давно есть (под .NET)... |
Сообщ.
#7
,
|
|
|
.NET обозначает кроссплатформенность (если не сегодня, то уж точно завтра), а WinAPI - это, к сожалению, только Win.
|
Сообщ.
#8
,
|
|
|
Цитата lambdafunction @ .NET обозначает кроссплатформенность (если не сегодня, то уж точно завтра), а WinAPI - это, к сожалению, только Win. Ога, при закрытых спецификациях на .NET 2.0 и выше и нелюбви мелкософта к немикрософтовским операционкам, я сильно соменваюсь, что это хоть когда-нибудь будет означать кроссплатформенность. |
Сообщ.
#9
,
|
|
|
Цитата lambdafunction @ Вообще-то, программы, использующие WinAPI, можно запускать и под, например, Linux. С помощью wine.WinAPI - это, к сожалению, только Win. А про кроссплатформенность .NET - это ты хорошо пошутил. |
Сообщ.
#11
,
|
|
|
Цитата lambdafunction @ .NET обозначает кроссплатформенность (если не сегодня, то уж точно завтра), а WinAPI - это, к сожалению, только Win. Да-да, много раз слышали. Посмеялись, и хватит. |
Сообщ.
#12
,
|
|
|
Оба варианта работают
Regular expression: ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) Regular expression: (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) Тут есть еще примеры http://komandin.org/regex/regex_view.html |
Сообщ.
#13
,
|
|
|
А на такое сработают?
http://1506842980/index.php?showtopic=177786&hl= |