繁体   English   中英

正则表达式验证无法正常工作

[英]Regex validation doesn't work as expected

var validatePassword = function(password) {

    var upper = new RegExp(/^(?=.*[A-Z]).+$/),
    lower = new RegExp(/^(?=.*[a-z]).+$/),
    symbols = new RegExp(/^(?=.*(_|[^\w])).+$/),
    numbers = new RegExp(/^(?=.*\d).+$/);

    if((upper.test(password) && lower.test(password)) || (upper.test(password) && numbers.test(password)) || (upper.test(password) && symbols.test(password)) || (lower.test(password) && numbers.test(password)) || (lower.test(password) && symbols.test(password)))
    {
        return true;
    }
    else
    {
        alert('Invalid password')
    }
}
validatePassword('Foo1!');
});

如果我只输入一个值,则只有输入任何值,它才返回true。

你应该做:

var upper = new RegExp(/^(?=.*[A-Z]).+$/),
    lower = new RegExp(/^(?=.*[a-z]).+$/),
    symbols = new RegExp(/^(?=.*(_|[^\w])).+$/),
    numbers = new RegExp(/^(?=.*\d).+$/);

至:

var upper = /^(?=.*[A-Z]).+$/,
    lower = /^(?=.*[a-z]).+$/,
    symbols = /^(?=.*(_|[^\w])).+$/,
    numbers = /^(?=.*\d).+$/;

您的正则表达式已经是一个正则表达式。 您不需要使用new RegExp("patter","flag");

首先让我们简化逻辑

var upper = new RegExp(/^(?=.*[A-Z]).+$/),
    lower = new RegExp(/^(?=.*[a-z]).+$/),
    symbols = new RegExp(/^(?=.*(_|[^\w])).+$/),
    numbers = new RegExp(/^(?=.*\d).+$/);

以上可以简化

var upper = /[A-Z]/,       // means it contains uppercase
    lower = /[a-z]/,       // means it contains lowercase
    symbols = /[\W_]/,     // means it contains non-word character or underscore
    numbers = /\d/;        // means it contains number

也在这里

// means must have (upper AND lower) OR ((upper OR lower) AND (symbol OR number))
if( 
    (upper.test(password) && lower.test(password)) ||
    (upper.test(password) && numbers.test(password)) ||
    (upper.test(password) && symbols.test(password)) ||
    (lower.test(password) && numbers.test(password)) ||
    (lower.test(password) && symbols.test(password))
  )

以上可以简化

// means must have (upper AND lower) OR ((upper OR lower) AND (symbol OR number))
if(
    (upper.test(password) && lower.test(password)) ||
    ((upper.test(password) || lower.test(password)) &&
    (symbols.test(password) || symbols.test(password)))
  )

由于只能是(上下)

upper.test(password) && lower.test(password)

可以用

var upandlow = /[a-z][A-Z]|[A-Z][a-z]/;

由于它必须具有(上或下),因此也可以一步检查

var upperlower = /[a-zA-Z]/;   // means it contains uppercase OR lowercase

由于它必须具有(符号或数字),因此也可以一步检查

var symbolsnumbers = /[\d\W_]/; // means it contains number OR non-word OR underscore

现在可以简化整个功能

var validatePassword = function(password) {

  var upandlow = /[a-z][A-Z]|[A-Z][a-z]/,
      upperlower = /[a-zA-Z]/, 
      symbolsnumbers = /[\d\W_]/;

  if ( 
    upandlow.test(password) ||
    (upperlower.test(password) &&  symbolsnumbers.test(password))) {
      console.log('true');
      return true;
  }
  else {
      //alert('Invalid password');
      console.log('Invalid');
  }
}


validatePassword('Foo!');

这是小提琴

祝好运 :)

根据您的评论,我更新了答案:

密码需要匹配于least two出的4 conditions ,并具有8 characterstrue

var validatePassword = function(password) {

    var numero = 0;
//check if a digit is present    
if(/(?=.*?[\d]).*$/.test(password)) {
     numero++;
}
//check if a uppercase letter is present  
if(/(?=.*?[A-Z]).*$/.test(password)) {
        numero++;
}
//check if a lowercase letter is present
if(/(?=.*?[a-z]).*$/.test(password)) {
         numero++;
}
//check if a special character is present
if(/(?=.*?(_|[^\w])).*$/.test(password)) {
         numero++;
}
//check if at least 8 characters are present        
if (/^(?=.{8,}).*$/.test(password)) {
    var length = true;
} 

if( numero>=2 && length){

        alert('Valid password');
        console.log(numero);
        return true;
    }
    else
    {
        alert('Invalid password');
        console.log(numero);
    }

}
validatePassword('foo4ogD!');

http://jsfiddle.net/tuga/S57Bb/4/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM