Регулярное выражение, чтобы соответствовать 2-10, но не 99

У меня есть поле в форме, которая принимает следующие значения: -1, 2-10, 99

У меня есть бизнес-правило, которое касается ответов 2-10.

Я пытаюсь написать регулярное выражение, которое будет соответствовать 2-10, но не 99, и у меня возникли проблемы.

Исходное выражение:

^2|3|4|5|6|7|8|9|10$

Сбой, потому что 99 совпадает (технически, дважды). Кроме того, границы Линии - это то, с чем мне никогда не было удобно. Я экспрессирую поведение, отличное от них в экспрессе, чем в других местах (например,.net). В этом конкретном случае, регулярное выражение выполняется в JavaScript. В любом случае, expresso, кажется, игнорирует их (и если я поставлю значения в скобках:

^[2|3|4|5|6|7|8|9|10]$

^[2-9]$

либо "все прописано", либо как диапазон, expresso никогда не возвращает совпадений, если я указываю открывающую строку / строку, закрывающую строку / символы строки (и да, я пытался сопоставить 10 отдельно во втором случае).

Я знаю я знаю. Если вы используете регулярное выражение для решения проблемы, то у вас есть две проблемы (и, вероятно, они начнут приглашать друзей, стиль 1 и 2). Я не должен использовать один здесь; Я могу перейти к описанию случая. Но, похоже, я должен использовать здесь регулярные выражения, и это кажется разумным. Я все еще довольно зеленый, когда дело доходит до регулярного выражения;

6 ответов

Решение

Для этого вам нужны паратезы. Далее я бы использовал диапазоны, чтобы все было читабельно:

^([2-9]|10)$

Это явно тот случай, когда вы должны использовать не RegExp, а числовую оценку:

var num = parseInt(aNumber, 10);
if (num >= 2 && num <= 10) {
    alert("Match found!");
}

Используйте круглые скобки вокруг чередований, поскольку сцепление имеет более высокий приоритет, чем чередование:

^(2|3|4|5|6|7|8|9|10)$

Полная функция javascript для соответствия 2 или 9, или 10

<script type="text/javascript">
    function validateValue( theValue )
    {
        if( theValue.match( /^([2-9]{1}|10)$/ ) )
        {
            window.alert( 'Valid' );
        }
        else
        {
            window.alert( 'invalid' );
        }
        return false;
    }
</script>

Регулярное выражение легко расширяется, чтобы включить все ваши правила:

/^(-1|[2-9]|10|99)$/ // will match -1, 2-10, 99

редактировать: я забыл упомянуть, что вам придется заменить свою собственную истинную / ложную ситуационную логику. edit2: добавил пропущенные скобки во второе регулярное выражение.

Причина, по которой ваше оригинальное выражение терпит неудачу, состоит в том, что вы подходите ^2, 3, 4, 5, 6, 7, 8, 9, 10$.

Попробуйте это регулярное выражение: ^(2|3|4|5|6|7|8|9|10)$

Эта онлайн-утилита очень хороша для генерации значений для числовых диапазонов: http://utilitymill.com/utility/Regex_For_Range. Для диапазона 2-10 включительно, это дает следующее выражение: \b0*([2-9]|10)\b, Если вы хотите опустить ведущие 0, уберите часть "0*".

Другие вопросы по тегам