簡體   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