Javascript 如何使用正确的正则表达式修复密码验证条件?

Javascript 如何使用正确的正则表达式修复密码验证条件?,javascript,html,regex,Javascript,Html,Regex,我正在尝试修复无法按预期工作的逻辑条件 例如,“密码中有两位数字”条件在1test2上失败,即使其中有两位数字 我的规则是: 密码必须至少有2位数字 密码必须至少包含6个字母 密码必须至少有一个特殊字符 密码长度必须至少为8个字符 功能检查密码(pwd){ 常量特殊字符=“[~\!@\$%\^&*\(\)\+{}\”:;,“\[\]” 如果(/[0-9]{2,}/.test(pwd)){//至少2位 返回true; } 如果(/[a-zA-Z]{6,}/.test(pwd)){//至少6个

我正在尝试修复无法按预期工作的逻辑条件

例如,“密码中有两位数字”条件在
1test2
上失败,即使其中有两位数字

我的规则是:

  • 密码必须至少有2位数字
  • 密码必须至少包含6个字母
  • 密码必须至少有一个特殊字符
  • 密码长度必须至少为8个字符

功能检查密码(pwd){
常量特殊字符=“[~\!@\$%\^&*\(\)\+{}\”:;,“\[\]”
如果(/[0-9]{2,}/.test(pwd)){//至少2位
返回true;
}
如果(/[a-zA-Z]{6,}/.test(pwd)){//至少6个字母
返回true;
}
if(新RegExp(特殊字符).test(pwd)){//至少1个特殊字符
返回true;
}
如果(pwd长度<8){
返回true;
}
}
您可以使用

const regex = /^(?=.{8})(?=(?:\D*\d){2})(?=(?:[^a-zA-Z]*[a-zA-Z]){6})(?=[^~!@#$%^&*()_+{}":;,'[\]]*[~!@#$%^&*()_+{}":;,'[\]])/
请参阅(该模式稍作修改,以避免在对单个多行字符串执行演示时匹配换行符)

详细信息

  • ^
    -字符串的开头
  • (?=(?:\D*\D){2})
    -密码必须至少有两位数字
  • (?=(?:[^a-zA-Z]*[a-zA-Z]){6}
    -密码必须至少包含6个字母
  • (?=[^~!@$%^&*(),'[\]*[~!@$%^&*(),'[\]])
    -密码必须至少有一个特殊字符
  • (?=.{8})
    -密码长度必须至少为8个字符
您也可以在代码中编写带有注释的正则表达式:

const regex=new RegExp(“^”+//字符串的开头
“(?=.{8})”+//长度必须至少为8个字符
String.raw`(?=(?:\D*\D){2}`+//必须至少有两位数字
“(?=(?:[^a-zA-Z]*[a-zA-Z]){6}”+//必须至少有6个字母
String.raw`(?=[^~!@$%^&*()[u+{}]:,'[\]*[~!@$%^&*()[u+{}]:,'[\]])必须至少有6个字母
);
console.log(regex);
您可以使用

const regex = /^(?=.{8})(?=(?:\D*\d){2})(?=(?:[^a-zA-Z]*[a-zA-Z]){6})(?=[^~!@#$%^&*()_+{}":;,'[\]]*[~!@#$%^&*()_+{}":;,'[\]])/
请参阅(该模式稍作修改,以避免在对单个多行字符串执行演示时匹配换行符)

详细信息

  • ^
    -字符串的开头
  • (?=(?:\D*\D){2})
    -密码必须至少有两位数字
  • (?=(?:[^a-zA-Z]*[a-zA-Z]){6}
    -密码必须至少包含6个字母
  • (?=[^~!@$%^&*(),'[\]*[~!@$%^&*(),'[\]])
    -密码必须至少有一个特殊字符
  • (?=.{8})
    -密码长度必须至少为8个字符
您也可以在代码中编写带有注释的正则表达式:

const regex=new RegExp(“^”+//字符串的开头
“(?=.{8})”+//长度必须至少为8个字符
String.raw`(?=(?:\D*\D){2}`+//必须至少有两位数字
“(?=(?:[^a-zA-Z]*[a-zA-Z]){6}”+//必须至少有6个字母
String.raw`(?=[^~!@$%^&*()[u+{}]:,'[\]*[~!@$%^&*()[u+{}]:,'[\]])必须至少有6个字母
);

console.log(regex)
我没有对您的Regexp做任何更改-仅对其周围的逻辑进行更改。您可能希望从变量
valid
开始,如果不满足这些条件,您可以设置
valid=false
。在函数末尾,您希望返回
valid
,它将是
true
的布尔值de>false取决于密码是否通过了所有测试

function checkPassword(pwd){
  let valid = true;

  const special_characters = "[~\!@#\$%\^&\*\(\)_\+{}\":;,'\[\]]"
  if (!/[0-9]{2,}/.test(pwd)){ // at least 2 digits
    valid = false;
  }
  if (!/[a-zA-Z]{6,}/.test(pwd)){ // at least  6 letters
    valid = false;
  }
  if (!new RegExp(special_characters).test(pwd)){ // at least 1 special character
    valid = false;
  }
  if (!pwd.length < 8){
    valid = false;
  }

  return valid;
}
功能检查密码(pwd){
让valid=true;
常量特殊字符=“[~\!@\$%\^&*\(\)\+{}\”:;,“\[\]”
如果(!/[0-9]{2,}/.test(pwd)){//至少2位
有效=错误;
}
如果(!/[a-zA-Z]{6,}/.test(pwd)){//至少6个字母
有效=错误;
}
如果(!new RegExp(特殊字符).test(pwd)){//至少1个特殊字符
有效=错误;
}
如果(!pwd.长度<8){
有效=错误;
}
返回有效;
}

旁注:复杂密码验证可能对用户有限制。鼓励用户使用更长的密码(或密码短语)要比使用几个特殊字符的更短密码安全得多。

我没有对您的Regexp进行任何更改,只是对其周围的逻辑进行了更改。您可能希望从变量
valid
开始,如果不满足这些条件,可以设置
valid=false
。在函数结束时,您希望返回
valid
,该值为
true
false
的布尔值,具体取决于密码是否通过了所有测试

function checkPassword(pwd){
  let valid = true;

  const special_characters = "[~\!@#\$%\^&\*\(\)_\+{}\":;,'\[\]]"
  if (!/[0-9]{2,}/.test(pwd)){ // at least 2 digits
    valid = false;
  }
  if (!/[a-zA-Z]{6,}/.test(pwd)){ // at least  6 letters
    valid = false;
  }
  if (!new RegExp(special_characters).test(pwd)){ // at least 1 special character
    valid = false;
  }
  if (!pwd.length < 8){
    valid = false;
  }

  return valid;
}
功能检查密码(pwd){
让valid=true;
常量特殊字符=“[~\!@\$%\^&*\(\)\+{}\”:;,“\[\]”
如果(!/[0-9]{2,}/.test(pwd)){//至少2位
有效=错误;
}
如果(!/[a-zA-Z]{6,}/.test(pwd)){//至少6个字母
有效=错误;
}
如果(!new RegExp(特殊字符).test(pwd)){//至少1个特殊字符
有效=错误;
}
如果(!pwd.长度<8){
有效=错误;
}
返回有效;
}

旁注:复杂的密码验证可能会对用户造成限制。鼓励用户使用更长的密码(或密码短语)比使用带有几个特殊字符的较短密码要安全得多。

试试这个。它似乎更易于阅读和维护:

功能检查密码(pwd){
常量特殊字符=/[%~!@$\^&*(\+{}):,“\[\]/;
返回pwd。替换(/[^0-9]/g',)。长度>=2
&&pwd.替换(/[^a-zA-Z]/g',)。长度>=6
&&特殊字符测试(pwd)
&&pwd.length>=8
}

日志(检查密码('FF%lkf%jd%fk12')试试这个。它似乎更易于阅读和维护:

功能检查密码(pwd){
常量特殊字符=/[%~!@$\^&*(\+{}):,“\[\]/;
返回pwd。替换(/[^0-9]/g',)。长度>=2
&&pwd.替换(/[^a-zA-Z]/g',)。长度>=6
&&特殊字符测试(pwd)
&&pwd.length>=8
}
log(checkPassword('FF%lkf%jd%fk12'));
该代码的逻辑错误。