Регулярное выражение, чтобы соответствовать 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*".