Javascript 如何检查密码是否至少包含一个允许的特殊字符?

Javascript 如何检查密码是否至少包含一个允许的特殊字符?,javascript,regex,match,Javascript,Regex,Match,我有检查密码的功能。此函数应检查密码值是否至少包含我在说明中列出的一个特殊特许。下面是一个例子: $('input[type=password]').keyup(function(){ var pswd=$(this.val(); //验证长度 如果(pswd.length

我有检查密码的功能。此函数应检查密码值是否至少包含我在说明中列出的一个特殊特许。下面是一个例子:

$('input[type=password]').keyup(function(){
var pswd=$(this.val();
//验证长度
如果(pswd.length<8){
$('#length').removeClass('valid').addClass('invalid');
}否则{
$('#length').removeClass('invalid').addClass('valid');
}
//确认信
if(pswd.match(/[a-z]/)){
$(“#字母”).removeClass('invalid').addClass('valid');
}否则{
$(“#字母”).removeClass('valid').addClass('invalid');
}
//验证大写字母
if(pswd.match(/[A-Z]/)){
$(“#大写”).removeClass('invalid').addClass('valid');
}否则{
$(“#大写”).removeClass('valid').addClass('invalid');
}
//验证特殊字符
if(pswd.match(/[!“#$%&'()*+,-.:;?@[\]^{124;}~]/){
$('#character')。removeClass('invalid')。addClass('valid');
}否则{
$('#character').removeClass('valid').addClass('invalid');
}
//验证号码
if(pswd.match(/\d/)){
$('#number')。removeClass('invalid')。addClass('valid');
}否则{
$('#number').removeClass('valid').addClass('invalid');
}
}).focus(函数(){
$('pswd_info').show();
}).blur(函数(){
$('pswd_info')。隐藏();
});
.form-group.required.控件标签:之后{
内容:“*”;
颜色:红色;
}
.密码容器{
位置:相对位置;
}
#pswd_信息{
位置:绝对位置;
宽度:250px;
字体大小:.875em;
}
#pswd_信息::之前{
内容:“\25B2”;
位置:绝对位置;
顶部:-12px;
左:45%;
字体大小:14px;
线高:14px;
颜色:#ddd;
文本阴影:无;
显示:块;
}
#pswd_信息{
保证金:0;
填充:0;
}
#pswd_信息李{
列表样式:无;
}
.无效{
左侧填充:22px;
线高:24px;
颜色:#ec3f41;
}
.有效{
左侧填充:22px;
线高:24px;
颜色:#3a7d34;
}
#pswd_信息{
显示:无;
}

密码
允许使用特殊字符:!“#$%&'()*+,-.:@[\]^_`{|}~
密码要求:
  • 至少一个字母
  • 至少一个大写字母
  • 至少一个数字
  • 至少有一个特殊字符
  • 至少应8个字符

您可以使用lookaheads大大简化您的表达式:

^
(?=[^A-Z]*[A-Z])
(?=[^!"#$%&'()*+,-.:;<=>?@[\]^_`{|}~]*[!"#$%&'()*+,-.:;<=>?@[\]^_`{|}~])
(?=\D*\d).{8,}
$
这利用了对比原则。
还请注意,
[A-z]
匹配。
这就是我的意思:

$('input[type=password]').keyup(function() {
  var pswd = $(this).val();
  if (pwsd.match(/^(?=[^A-Z]*[A-Z])(?=[^!"#$%&'()*+,-.:;<=>?@[\]^_`{|}~]*[!"#$%&'()*+,-.:;<=>?@[\]^_`{|}~])(?=\D*\d).{8,}$/)) {
     // now, it is valid
  } else {
     // invalid
  }
}).focus(function() {
  $('#pswd_info').show();
}).blur(function() {
  $('#pswd_info').hide();
});
$('input[type=password]').keyup(function(){
var pswd=$(this.val();
如果(pwsd.match(/^(?=[^A-Z]*[A-Z])(?=[^!“$%&'()*+,-:;?@[\]^{{124}]*[!”(?=$%&'()*+,-:;?[\]^{124}])(?=\ D*\D.{8,}$/){
//现在,它是有效的
}否则{
//无效的
}
}).focus(函数(){
$('pswd_info').show();
}).blur(函数(){
$('pswd_info')。隐藏();
});

正则表达式的可能重复项
[A-z]
应该是
[A-z]
。我还建议您至少使用
[^a-zA-Z\d]
而不是符号列表。@WiktorStribiżew创建的范围是什么?所有允许的特殊字符?好的,
[,-.]
匹配
-
,它们在ASCII表中只是连续的。让我们来看看。那么,我应该在我要查找特殊字符的行中替换什么?我确实犯了一个错误,应该是[a-z]而不是[a-z]。谢谢。@espresso_coffee:从
//验证长度
//验证编号
(包括在内)的所有内容都可以删除。我仍然看不出您的代码将如何替换我的代码,并且仍然可以正常工作。您能举个例子吗?无法打开链接。@espresso_coffee:请查看更新的答案,并将代码张贴在那里。
$('input[type=password]').keyup(function() {
  var pswd = $(this).val();
  if (pwsd.match(/^(?=[^A-Z]*[A-Z])(?=[^!"#$%&'()*+,-.:;<=>?@[\]^_`{|}~]*[!"#$%&'()*+,-.:;<=>?@[\]^_`{|}~])(?=\D*\d).{8,}$/)) {
     // now, it is valid
  } else {
     // invalid
  }
}).focus(function() {
  $('#pswd_info').show();
}).blur(function() {
  $('#pswd_info').hide();
});