2012-06-13 2 views
18

Привет, я хочу сопоставить число, которое меньше или равно 100, может быть любым в пределах 0-100, но регулярное выражение не должно совпадать с числом, которое больше 100, например 120 130,150,999 и т. Д.Как совместить число, которое меньше или равно 100?

+2

Как насчет '0.5' или' 1e2'? Должны ли они соответствовать? Как насчет '0000001'? –

+6

Почему вы хотите использовать регулярное выражение для этого? У Perl уже есть отлично обслуживаемые операторы сравнения Boolean (<, <=, ==, >,> =). –

+1

Как говорит Дейв, вы уверены, что хотите регулярного выражения? Perl будет обрабатывать переменную как строку или число взаимозаменяемо, и вы можете написать 'if ($ num> = 0 и $ num <= 100) {...}' – Borodin

ответ

0

регулярное выражение для этого

perl -le 'for (qw/0 1 19 32.4 100 77 138 342.1/) { print "$_ is ", /^(?:100|\d\d?)$/ ? "valid input" : "invalid input"}' 
6

Как об этом для регулярных выражений:

^([0-9]|[1-9][0-9]|100)$ 

это проверить будет 7, 82, 100 для примеров, но будет не проверки 07 или 082.

Check this out для получения дополнительной информации (и вариации, включая нулевой префиксов) на диапазон номеров проверки


Если вам нужно, чтобы обслужить чисел с плавающей точкой, вы должны read this, здесь это выражение можно использовать:

плавающей запятой: ^[-+]?([0-9]|[1-9][0-9]|100)*\.?[0-9]+$

36

Попробуйте

\b(0*(?:[1-9][0-9]?|100))\b 

Объяснение

" 
\b    # Assert position at a word boundary 
(    # Match the regular expression below and capture its match into backreference number 1 
    0    # Match the character “0” literally 
     *   # Between zero and unlimited times, as many times as possible, giving back as needed (greedy) 
    (?:   # Match the regular expression below 
        # Match either the regular expression below (attempting the next alternative only if this one fails) 
     [1-9] # Match a single character in the range between “1” and “9” 
     [0-9] # Match a single character in the range between “0” and “9” 
      ?  # Between zero and one times, as many times as possible, giving back as needed (greedy) 
     |   # Or match regular expression number 2 below (the entire group fails if this one fails to match) 
     100  # Match the characters “100” literally 
    ) 
) 
\b    # Assert position at a word boundary 
" 

Визит here для будущих проблем.

+5

+1 для объяснения – Dave

+4

указанная вами ссылка ограничена запрашивая имя пользователя и пароль! – goseo

+0

Фантастический! Спасибо за объяснение. –

3

Использование Код утверждения если вам нужно регулярное выражение (в конечном счете):

/^(.+)$(??{$^N>=0 && $^N<=100 ? '':'^'})/ 

Тест:

my @nums = (-1, 0, 10, 22, 1e10, 1e-10, 99, 101, 1.001e2); 

print join ',', grep 
       /^(.+)$(??{$^N>=0 && $^N<=100 ? '':'^'})/, 
       @nums 

Результат:

0,10,22,1e-010,99 

(==>Here is sth. to learn about code assertions).

+0

попытался увидеть ссылку, но все еще не понял регулярное выражение. Как вы думаете, вы можете это объяснить? (специально ---? '': '^' --- часть – taiko

0

Это Regex соответствует номера 0-100 DIAPASON и запретить номера типа 001:

\b(0|[1-9][0-9]?|100)\b 
0

Мой практический совет.

Лично я бы воздержался от написания такого сложного регулярного выражения. Что, если ваш номер изменится с 100 до 200 в ближайшем будущем. Вашему регулярному выражению придется значительно изменить, и писать его может даже сложнее. Все вышеперечисленные решения НЕ являются явным объяснением, и вам придется дополнить его комментарием в коде. Это запах.

Вопросы читаемости. Код предназначен для людей, а не для машин.

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

0

это соответствует 0 до 100

^0*([0-9]|[1-8][0-9]|9[0-9]|100)$ 
Смежные вопросы