Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.171] |
|
Сообщ.
#1
,
|
|
|
Добрый день,
подскажите пожалуйста регулярное выражение, которое пропускает числа в диапазоне от 100, до 999. Число 999 может быть и меньше, например 781. 999 это максимальное значение. Нашел вот такой пример, но если я передаю в выражение значение 501, оно его пропускает, несмотря на верхний предел в 500: '/^(?!100$)((?:[1-9]\d\d)|500)$/' Спасибо за помощь! |
Сообщ.
#2
,
|
|
|
Для чисел из диапазона [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 можно заменить на ^ и $ |
Сообщ.
#3
,
|
|
|
Цитата iPhonesoft @ числа в диапазоне от 100, до 999 Предполагается, что в строке только одно значение, чекаем ее от начала и до конца: ^[1-9]\d{2}$ |
Сообщ.
#4
,
|
|
|
Спасибо большое всем ответившим.
Да, в строке только цифры. А как взять диапазон от 100 до 672? 100, 101, 102... 672 |
Сообщ.
#5
,
|
|
|
Цитата iPhonesoft @ А как взять диапазон от 100 до 672? Нахрен тебе такой геморрой!!! Регулярки эффективно работают и понимаются на примитивных шаблонах. Остальное тупо усложнение - не по фэншую и не по Бритве Оккама. Вот смотри на твоем примере ... Сорян, я на Perl'е напишу, а ты зацени разницу: Твой желаемый результат чисто на регулярке: 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)$/); "Человеческий" вариант, и не менее тормозной, а может и более быстрый, но более понятный: say "Число попало в диапазон 100..672" if (($i =~ /^\d+$/) && ($i > 99) && ($i < 673)); А теперь спроси, нужен ли тебе именно полный анализ в регулярке? |
Сообщ.
#6
,
|
|
|
Спасибо тебе огромное за объяснение, и пример кода. Да, всё верно, лучше будет на простом PHP тогда написать: if($string > 99 && $string < 673)...
|
Сообщ.
#7
,
|
|
|
Majestio, что-то ты для чисел 100…672 слишком намудрил
Правильная регулярка для этого диапазона выглядит гораздо проще '^(?:[1-5]\d\d|6[0-6]\d|67[0-2])$' iPhonesoft, даже на интерпретируемых языках типа PHP выделение числа регуляркой с последующей проверкой диапазона может оказаться быстрее. В языках, где есть возможность проверить строку на "числообразность" (только цифры, возможно обрамлённые по бокам пробелами), обычно быстрее оказывается не искать нужные строки регуляркой, а проверить строку на "число" средствами языка, преобразовать её в число и проверить диапазон. Без регулярок или какого-либо их аналога не обойтись, если числа помечены каким-то текстом, по которому их и приходится выискивать, и значит их надо из этого текста выделять. Или нужны не числа, а даты, например, с их богатством представлений. |
Сообщ.
#8
,
|
|
|
Спасибо большое за регулярное выражение, и подробное объяснение!
Для меня это было очень важно, и сильно помогло в деле! |
Сообщ.
#9
,
|
|
|
Цитата amk @ Majestio, что-то ты для чисел 100…672 слишком намудрил Правильная регулярка для этого диапазона выглядит гораздо проще Согласен. У тебя это получилось более красивше! И тем не менее ... твоя регулярка, равно как и моя длинная не ловит число в скаляре '0101'. А вот мой второй вариант это обрабатывает по бесту: say "Число попало в диапазон 100..672" if (($i =~ /^\d+$/) && ($i > 99) && ($i < 673)); |