Вы можете использовать регулярное выражение
/^(?=.{1,}[a-z])(?=.{1,}[A-Z])(?=.{1,}([£$%^&*@~])).{8,20}$/
, чтобы соответствовать всем этим примерам.Вот краткое объяснение:
^ // the start of the string
(?=.{1,}[a-z]) // use positive look ahead to see if at least one lower case letter exists
(?=.{1,}[A-Z]) // use positive look ahead to see if at least one upper case letter exists
(?=.{1,}[£$%^&*@~]) // use positive look ahead to see if at least one underscore or special character exists
.{8,20} // gobble up the entire string and match between 8 and 20
$ // the end of the string
Вы бы использовали это так:
function isPasswordValid(parola)
{
if(!parola)
return false;
var reg = /^(?=.{1,}[a-z])(?=.{1,}[A-Z])(?=.{1,}([£$%^&*@~])).{8,20}$/g;
if(parola && reg.test(parola)){
//do stuff here
}
}
, если вы не хотите делать все это, для вашего кода это очень простое исправление!удалите лишние (
и добавьте это к своему тесту:
function isPasswordValid(parola){
if(!parola)
return false;
.
.
.
.
.
.
if(parola && (hasSpecialCharacter(parola) && hasLowerCase(parola) && hasUpperCase(parola) && isLongEnough(parola))){
// do stuff here
}
проверка только переменной будет оценена как ложная, если она:
- ноль
- undefined
- NaN
- пустая строка ("")
- 0
- false
и как true в противном случае.
Это должно исправить все ваши проблемы.
ОБНОВЛЕНИЕ Спасибо Патрику Робертсу за указание на ошибку в регулярном выражении.ниже приведен рабочий пример.
const regex = /^(?=.{1,}[a-z])(?=.{1,}[A-Z])(?=.{1,}([£$%^&*@~])).{8,20}$/g;
const str = 'aA$';
let m;
if ((m = regex.exec(str)) !== null) {
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
else{
console.log('no match found')
}