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

У меня есть поле в форме, которое принимает следующие значения: -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 ]

46 голосов
/ 09 февраля 2009

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

var num = parseInt(aNumber, 10);
if (num >= 2 && num <= 10) {
    alert("Match found!");
}
20 голосов
/ 09 февраля 2009

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

^([2-9]|10)$
7 голосов
/ 09 февраля 2009

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

^(2|3|4|5|6|7|8|9|10)$
1 голос
/ 09 февраля 2009

Полная функция 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

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

0 голосов
/ 30 августа 2010

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

0 голосов
/ 09 февраля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...