2016-09-08 2 views
0

Ниже мой код:JavaScript RegExp [^ ...] выражение не дает желаемого результата

function isValid(passCode){ 
    var myRegExp=/[^a-z\d]/i; 
    return !(myRegExp.test(passCode)); 
} 

if (isValid(prompt("Enter passcode:",""))){ 
    alert("Access granted"); 
}else{ 
    alert("Denied"); 
} 

Согласно моему пониманию, если я прохожу, например, abc в качестве параметра функции isValid(), myRegExp.test должен возвращать true и, следовательно, isValid() должен вернуть false (как используется оператор !). Но функция возвращает true. Зачем?

Вот JSFiddle: https://jsfiddle.net/k7d4va5k/#&togetherjs=GCP5bmgPP4

+4

^внутри [] делает это «не» ... так что '/ [^ az \ d] /. Test ('abc')' будет ложным ... с другой стороны '/^[az \ d ] /. test ('abc') 'истинно, потому что^в этом случае соответствует началу строки (это то, что, я думаю, вы, возможно, намеревались) –

+0

Вы уверены, что хотите проверить. @Jaromanda была права. Если вы передадите abc, myRegExp.test должен вернуть false – kishorekumaru

+0

Пожалуйста, открепите свой код. –

ответ

1

С «символьным классом», называемый также «набор символов», вы можете сказать, движок регулярных выражений, чтобы соответствовать только один из нескольких символов. Просто разместите символы, которые вы хотите сопоставить между квадратными скобками.

/[a-z\d]/ 

это waill матч алфавиты и цифры

Typing каретки (^) после открытия квадратной скобки нивелируют класс символов. В результате класс символов соответствует любому символу, который не находится в классе символов. Следовательно

/[^a-z\d]/.test('abc') will be false 

/^[a-z\d]/.test('abc') will be true 

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

Смежные вопросы