Диапазон значений RegExp (от 1 до 36)
Я много искал и не могу найти решение для этого RegExp (я должен сказать, что я не очень разбираюсь в Reg. Expressions).
Я хотел бы проверить число от 1 до 36, исключая 0 и 37 и выше.
То, что я до сих пор и почти работает (он не принимает 17, 18, 19, 27, 28, 29)...
^[1-9]{1}$|^[1-3]{1}[0-6]{1}$|^36$;
Кто-нибудь может мне помочь?
Ответы
Ответ 1
Вы знаете о \d
, правильно?
^([1-9]|[12]\d|3[0-6])$
Попробуйте это в консоли:
function test() {
for(var i = 0; i < 100; i++) {
if (/^([1-9]|[12]\d|3[0-6])$/.test(i.toString()) != (i >= 1 && i <=36)) {
document.write(i + "fail");
}
else
document.write(i + "pass");
document.write("<br/>");
}
}
Ответ 2
^[0-9]|[0-2][0-9]|3[0-6]$
Здесь разбиение:
[0-9]
= любая цифра от 0 до 9
|
= OR
[0-2][0-9]
= '1' или '2', за которой следует любая цифра от 0 до 9
|
= OR
3[0-6]
= '3', за которой следует любая цифра от 0 до 6.
Поскольку @mu слишком коротко сказано, использование целочисленного сравнения было бы намного проще и более эффективным. Вот пример функции:
function IsInRange(number)
{
return number > 0 && number < 37;
}
Ответ 3
Попробуйте следующее:
^[1-9]$|^[1-2][0-9]$|^3[0-6]$
(Все 1 разрядные номера от 1 до 9, все 1x и 2x номера и 3x номера от 30 до 36).
Ответ 4
Я не уверен, почему все ответы на этот вопрос повторяют ошибку добавления границ (^
и $
) до и после каждого условия. Но вам нужно только сделать:
^[1-9]|[1-2][0-9]|3[0-6]$
Я также создал библиотеку JavaScript/Node.js, to-regex-range, чтобы упростить создание таких диапазонов.
Ответ 5
Попробуйте следующее:
/^[1-9]$|^[1-2]\d$|^3[0-6]$/
Ответ 6
Попробуйте ^[1-9]$|^[1-2]\d$|^3[0-6]$
Ответ 7
Чисто по академическим причинам, я добавлю уникальный и точный образец.
/^(3[0-6]?|[12]\d?|[4-9])$/
В шаблоне есть три ветки:
- Первые матчи: 3, 30, 31, 32, 33, 34, 35, 36
- Вторые матчи: 1, 2, 10-19, 20-29
- Третьи матчи: 4, 5, 6, 7, 8, 9
Если в моем шаблоне есть преимущество в эффективности (а не в том, что эта задача, скорее всего, приведет к значительному истощению ресурсов - если вы не выполняете тысячи таких оценок), это сводится к тому, что в шаблоне нет избыточных проверок.,
Это может не иметь никакого значения для движка регулярных выражений, но я упорядочил свои ветки на основе тех, которые требуют наименьших "усилий" для оценки (вместо естественной последовательности чисел).
Паттерн Гарпо настолько короткий, насколько паттерн может быть построен, но [123]
- это совпадения из первых цифр, которые удовлетворяются множеством ветвей.
Шаблоны @MichaelHoffmann и @jonschlinkert не верны, потому что они не могут распределить необходимые привязки для каждой ветки. Это кратко достигается путем наложения всех ветвей в группе захвата, но, как показали @ninjalj, @qwertymk и @amit_g, точно так же точно применять привязки к каждой ветки.
let txt = '<table border=1 cellpadding=4><tr><th>Number</th><th>Harpo</th><th>Michael Hoffmann</th><th>ninjalj</th><th>jonschlinkert</th><th>qwertymk</th><th>amit_g</th><th>mickmackusa</th></tr>',
str,
i;
for (i = 0; i <= 40; ++i) {
str = '' + i;
txt += '<tr><td>' + i;
txt += '</td><td>' + /^([1-9]|[12]\d|3[0-6])$/.test(str);
txt += '</td><td>' + /^[0-9]|[0-2][0-9]|3[0-6]$/.test(str);
txt += '</td><td>' + /^[1-9]$|^[1-2][0-9]$|^3[0-6]$/.test(str);
txt += '</td><td>' + /^[1-9]|[1-2][0-9]|3[0-6]$/.test(str);
txt += '</td><td>' + /^[1-9]$|^[1-2]\d$|^3[0-6]$/.test(str);
txt += '</td><td>' + /^[1-9]$|^[1-2]\d$|^3[0-6]$/.test(str);
txt += '</td><td>' + /^(3[0-6]?|[12]\d?|[4-9])$/.test(str);
txt += '</td></tr>';
}
txt = txt + '</table>';
document.getElementById('test').innerHTML = txt;
<div id="facts">Correct Pattern Designers: Harpo, ninjalj, qwertymk, amit_g, mickmackussa<br>Incorrect Patterns: Michael Hoffmann, jonschlinkert <br></div>
<div id="test"></div>