На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> regex для ip-адреса , Как определить, правильно ли введен ip, с помощью регулярного выражени
    Здравствуйте.

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

    Пытаюсь с помощью регулярного выражения определить, правильно ли введен 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}.

    Если кто-нибудь располагает идеями, поделитесь, пожалуйста. Буду очень благодарен.
      C помощью регэкспов определять наличие числа в диапазоне 0..255 - это жестко, имхо.
      Напиши просто
      ExpandedWrap disabled
        ^(\d{1,3}\.){3}\d{1,3}$
      для предварительного анализа, а уж диапазоны при парсинге адреса проверяй.

      Впрочем, раз ты можешь напрячь пользователей:
      Цитата lambdafunction @
      и заставил пользователя вводить с ведущими нулями (например, 192.168.000.001)
      то заставь их вводить числа в шестнадцатеричном формате и с ведущими нулями - тогда всё просто будет. :)
        Шестнадцатеричные было бы проще обрабатывать, конечно, но (а) программа под винду, и, соответственно, (б) пользователь может вообще не знать, что такое 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-адреса до точки; а потом три раза точка, а за ней цифры. Работает красиво, пока что ни одной ошибки ни один из тестеров не обнаружил, хотя в их руках ломается все и вся. Надеюсь, что код работать будет исправно и долго.
          КС грамматику лучше напишите, не мучайтесь с regex'пами.
            В этом случае вообще проще свой компонент создать, который будет отслеживать каждую позицию и править общее значение автоматически. Кстати, вполне вероятно, что такой компонент уже давным-давно есть (под .NET)... Очень даже может быть...
              Цитата lambdafunction @
              Кстати, вполне вероятно, что такой компонент уже давным-давно есть (под .NET)...
              Почему именно под .NET? Обычный WinAPI. Называется IP address control, класс окна WC_IPADDRESS, находится в Comctl32.dll начиная с версии 4.71
                .NET обозначает кроссплатформенность (если не сегодня, то уж точно завтра), а WinAPI - это, к сожалению, только Win.
                  Цитата lambdafunction @
                  .NET обозначает кроссплатформенность (если не сегодня, то уж точно завтра), а WinAPI - это, к сожалению, только Win.

                  Ога, при закрытых спецификациях на .NET 2.0 и выше и нелюбви мелкософта к немикрософтовским операционкам, я сильно соменваюсь, что это хоть когда-нибудь будет означать кроссплатформенность.
                    Цитата lambdafunction @
                    WinAPI - это, к сожалению, только Win.
                    Вообще-то, программы, использующие WinAPI, можно запускать и под, например, Linux. С помощью wine.
                    А про кроссплатформенность .NET - это ты хорошо пошутил. :)
                        Цитата lambdafunction @
                        .NET обозначает кроссплатформенность (если не сегодня, то уж точно завтра), а WinAPI - это, к сожалению, только Win.

                        Да-да, много раз слышали. Посмеялись, и хватит.
                          Оба варианта работают

                          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
                            А на такое сработают?
                            http://1506842980/index.php?showtopic=177786&hl=
                            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0302 ]   [ 14 queries used ]   [ Generated: 29.05.24, 03:01 GMT ]