Диапазон значений 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]$/

DEMO

Ответ 6

Попробуйте ^[1-9]$|^[1-2]\d$|^3[0-6]$

Ответ 7

Чисто по академическим причинам, я добавлю уникальный и точный образец.

/^(3[0-6]?|[12]\d?|[4-9])$/

В шаблоне есть три ветки:

  1. Первые матчи: 3, 30, 31, 32, 33, 34, 35, 36
  2. Вторые матчи: 1, 2, 10-19, 20-29
  3. Третьи матчи: 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>