На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR
  
    > Регулярное выражение для чисел в диапазоне от 100 до 999?
      Добрый день,

      подскажите пожалуйста регулярное выражение, которое пропускает числа в диапазоне от 100, до 999.
      Число 999 может быть и меньше, например 781. 999 это максимальное значение.

      Нашел вот такой пример, но если я передаю в выражение значение 501, оно его пропускает, несмотря на верхний предел в 500:

      ExpandedWrap disabled
        '/^(?!100$)((?:[1-9]\d\d)|500)$/'


      Спасибо за помощь!
      Сообщение отредактировано: iPhonesoft -
        Для чисел из диапазона [100…999] шаблон
        '\b[1-9]\d\d\b'
        \b нужен, чтобы не ловить переменные типа abc234

        Для диапазона [100…500] число 500 приходится ловить отдельно
        '\b(?:[1-4]\b\b|500)\b'

        Для диапазона [101…500]
        '\b(?!100)(?:[1-4]\b\b|500)\b'

        Если предполагается что в строке расположено только одно число, то \b можно заменить на ^ и $
          Цитата iPhonesoft @
          числа в диапазоне от 100, до 999

          Предполагается, что в строке только одно значение, чекаем ее от начала и до конца:

          ExpandedWrap disabled
            ^[1-9]\d{2}$
            Спасибо большое всем ответившим.
            Да, в строке только цифры. А как взять диапазон от 100 до 672?
            100, 101, 102... 672
              Цитата iPhonesoft @
              А как взять диапазон от 100 до 672?

              Нахрен тебе такой геморрой!!! >:(

              Регулярки эффективно работают и понимаются на примитивных шаблонах. Остальное тупо усложнение - не по фэншую и не по Бритве Оккама.

              Вот смотри на твоем примере ... Сорян, я на Perl'е напишу, а ты зацени разницу:

              Твой желаемый результат чисто на регулярке:

              ExpandedWrap disabled
                say "Число попало в диапазон 100..672" if ($i =~ /^(?:[1-5][0-9]{2}|6[0-5][0-9]|60[0-7]|61[0-2]|62[0-2]|66[0-9]|670|671|672)$/);

              "Человеческий" вариант, и не менее тормозной, а может и более быстрый, но более понятный:

              ExpandedWrap disabled
                say "Число попало в диапазон 100..672" if (($i =~ /^\d+$/) && ($i > 99) && ($i < 673));

              А теперь спроси, нужен ли тебе именно полный анализ в регулярке?
                Спасибо тебе огромное за объяснение, и пример кода. Да, всё верно, лучше будет на простом PHP тогда написать: if($string > 99 && $string < 673)...
                  Majestio, что-то ты для чисел 100…672 слишком намудрил
                  Правильная регулярка для этого диапазона выглядит гораздо проще
                  ExpandedWrap disabled
                    '^(?:[1-5]\d\d|6[0-6]\d|67[0-2])$'

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

                  В языках, где есть возможность проверить строку на "числообразность" (только цифры, возможно обрамлённые по бокам пробелами), обычно быстрее оказывается не искать нужные строки регуляркой, а проверить строку на "число" средствами языка, преобразовать её в число и проверить диапазон.

                  Без регулярок или какого-либо их аналога не обойтись, если числа помечены каким-то текстом, по которому их и приходится выискивать, и значит их надо из этого текста выделять.
                  Или нужны не числа, а даты, например, с их богатством представлений.
                  Сообщение отредактировано: amk -
                    Спасибо большое за регулярное выражение, и подробное объяснение!
                    Для меня это было очень важно, и сильно помогло в деле!
                      Цитата amk @
                      Majestio, что-то ты для чисел 100…672 слишком намудрил
                      Правильная регулярка для этого диапазона выглядит гораздо проще

                      Согласен. У тебя это получилось более красивше!

                      И тем не менее ... твоя регулярка, равно как и моя длинная не ловит число в скаляре '0101'.
                      А вот мой второй вариант это обрабатывает по бесту:

                      ExpandedWrap disabled
                        say "Число попало в диапазон 100..672" if (($i =~ /^\d+$/) && ($i > 99) && ($i < 673));
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0308 ]   [ 15 queries used ]   [ Generated: 9.12.24, 20:14 GMT ]