Регулярное выражение: числовой диапазон

Как вы пишете регулярное выражение, которое соответствует числовому диапазону от 0 или 000 до 180?

Ответ 1

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

Чтобы сделать это с помощью чистого регулярного выражения, вам нужно идентифицировать шаблон и записать его:

^(0?[0-9]{1,2}|1[0-7][0-9]|180)$

У этого есть три альтернативы: один для одно- и двухзначных чисел (допускающих ведущие нули), где каждая цифра может быть чем угодно от 0 до 9. И еще один, который указывает, какой диапазон цифр разрешен для каждой цифры в трехзначное число. В этом случае это означает, что первая цифра должна быть 1, вторая - от 0 до 7, а последняя может быть любой. Третий вариант - это просто номер 180, который не очень хорошо вписывается в шаблон в другом месте.

Более простой подход может быть

^(0{0,2}[0-9]|0?[1-9][0-9]|1[0-7][0-9]|180)$

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

Ответ 2

Я не думаю, что регулярное выражение является правильным выбором для этого. Вы пытались разобрать ценность? Если вам нужно использовать регулярное выражение, я бы совпадал с \d{1,3}, анализируя строку и затем проверяя число в коде.

Ответ 3

На UtilityMill.com есть онлайн-утилита для их генерации. По вашему вопросу это возвращает:

0*([0-9]{1,2}|1[0-7][0-9]|180)

Ответ 4

Недавно выпущенный инструмент командной строки rgxg генерирует регулярные выражения, которые соответствуют определенному диапазону номеров:

$ rgxg range -Z 0 180
(180|1[0-7][0-9]|0?[0-9]{1,2})

Для получения дополнительной информации см. http://rgxg.sf.net.

Ответ 5

Мои два цента:

Любой, кто отправил ответ на этот вопрос , должен был проверить свое регулярное выражение с AT LEAST следующими входами:

В случае совпадения: 0, 00, 000, 5, 05, 005, 95, 095, 180

НЕ должно соответствовать: 0000, 0095, 181, 190

Я думаю, что Johannes Rössel написал так же хорошо, как вы получите:

^(0?[0-9]{1,2}|1[0-7][0-9]|180)$

Ответ 6

Попробуйте следующее:

^(0|[1-9][0-9]?|1[0-7][0-9]|180)$

Ответ 7

Я бы разбил диапазоны так, чтобы их можно было легко указать в отдельном отдельном регулярном выражении:

^(0|0[0-9][0-9]|1[0-7][0-9]|180)$

Или, что то же самое в человеческих читаемых терминах:

0
000-099
100-179
180

Если вам нужен двузначный диапазон, это просто вопрос добавления [0-9][0-9] в регулярное выражение.

Кроме того, если у вас возникли проблемы с работой с регулярным выражением, попробуйте указать их таким образом, чтобы операторы регулярных выражений были как можно более ясными - как правило, есть способ представить их таким образом, чтобы их функция была более понятной, особенно если язык, в котором вы делаете это, позволяет отделить части спецификации регулярного выражения в отдельные столбцы и строки.

Ответ 8

Я изменил Gumbo's:

^(00?0?|0?[1-9][0-9]?|1[0-7][0-9]|180)$

Попробуйте это.

Ответ 9

если вам не нравятся отрицательные числа

>> r = /\b(0?\d?\d|1[0-7]\d|180)\b/
=> /\b(0?\d?\d|1[0-7]\d|180)\b/
>> (0..200).map {|i| i.to_s =~ r }
=> [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
>> 

Ответ 10

Вы можете использовать следующее регулярное выражение

^([0-1]?[0-7]?[0-9])|180$