Javascript中用于密码验证的正则表达式

7

正则表达式密码复杂性要求在创建或更改密码时必须应用以下四个特征中的任意三个。

  • 字母 - 至少一个大写字母
  • 字母 - 至少一个小写字母
  • 数字 - 至少一个数字字符
  • 特殊字符 - 至少一个特殊字符

我正在尝试使用以下代码,但对于特殊字符无效。

(?=^.{6,}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.*

我希望验证我的正则表达式是否符合以下4种情况:

匹配条件

  • P@ssword
  • Password1
  • p@ssword1
  • p@12345

可能是密码强度验证的正则表达式问题的重复。 - Toto
7个回答

10

我认为你可以使用的正则表达式是:

(?=^.{6,}$)(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[^A-Za-z0-9]).*

我不确定为什么你的正则表达式中有这么多或运算符,但这个正则表达式可以匹配以下内容:

  • (?=^.{6,}$) - 字符串长度 > 5
  • (?=.*[0-9]) - 包含数字
  • (?=.*[A-Z]) - 包含大写字母
  • (?=.*[a-z]) - 包含小写字母
  • (?=.*[^A-Za-z0-9]) - 包含非字母数字字符。

正则表达式图像


但我只需要其中三个选项,而不是全部四个。 - sivanv
@sivanv哦,但是你的正则表达式不起作用吗?看看这个。你可以逐个更改密码来检查其他密码。 - Jerry

7

我认为在这种情况下使用单个正则表达式会很混乱。你可以轻松地做如下操作:

var count = 0;

count += /[a-z]/.test(password) ? 1 : 0;
count += /[A-Z]/.test(password) ? 1 : 0;
count += /\d/.test(password) ? 1 : 0;
count += /[@]/.test(password) ? 1 : 0;

if(count > 2) {
    alert('valid')
}

我能用正则表达式完成它吗,这是要求。:( 我已经使用上述方法实现了它,但需要使用普通的正则表达式。 - sivanv
这是正则表达式,但有多个。 - elclanrs
2
@sivanv,你还必须学会,即使问题一开始看起来像钉子,解决方案并不总是锤子。 - Danubian Sailor
一个正则表达式在这里会太混乱,以后维护起来也会很麻烦。 - Arun P Johny
我觉得你可以简化一下:count += +/[a-z]/.test(password) ,其他的也是这样吧?或者直接用:[/[a-z]/,/[A-Z]/,/\d/,/\W/].filter(function(t){ return t.test(pass); }).length > 2 - elclanrs

2
使用这个正则表达式:

(?=^.{6,10}$)(?=.\d)(?=.[a-z])(?=.[A-Z])(?=.[!@#$%^&*()_+}{":;'?/>.<,])(?!.\s).$**


无法工作,即使在 fiddle 上也是如此,请再检查一下?即使 / 也没有被转义,这怎么可能会起作用呢? - CME64

0
var pattern = new RegExp(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]).{6,}$/);

    if(pattern.test(value)){
         return true;
    } else {
         return false;
    }

它也可以正常处理特殊字符。


0

我认为你也需要对所有特殊字符进行这样的操作:[已更新以拒绝空格]

    $(document).ready(function(){
    $('input').change(function(){
    var count = 0;
    var pass = $(this).val();
        count += /[a-z]/.test(pass) ? 1 : 0;
        count += /[A-Z]/.test(pass) ? 1 : 0;
        count += /\d/.test(pass) ? 1 : 0;
        count += /[^\w\d\s]/.test(pass) ? 1 : 0;
        (count>2 & !/[\s]+/.test(pass)) ? $(this).css('background-color','lime'):$(this).css('background-color','orange');
    });

});

还有 jsFiddle:jsFiddle


0

非英语UTF-8

没有任何给出的解决方案允许国际字母,例如éÉöÖæÆáÁ,但主要集中在英语ASCII字母表上。

以下正则表达式使用Unicode、UTF-8来识别大小写,从而允许国际字符:

// Match uppercase, lowercase, digit or #$!%*?& and make sure the length is 6 to 36 in length  
const pwdFilter = /^(?=.*\p{Ll})(?=.*\p{Lu})(?=.*[\d|@#$!%*?&])[\p{L}\d@#$!%*?&]{6,36}$/gu

if (!pwdFilter.test(pwd)) {
    // Show error that password has to be adjusted to match criteria
}

正则表达式:

/^(?=.*\p{Ll})(?=.*\p{Lu})(?=.*[\d|@#$!%*?&])[\p{L}\d@#$!%*?&]{6,36}$/gmu

检查密码中是否使用了大写字母、小写字母、数字或@#$!%*?&等特殊字符。它还限制了密码长度,最少为6个字符,最多为36个字符(请注意,表情符号、‍等在长度上计算为多个字符)。 结尾处的u表示使用UTF-8编码。


-1
为了匹配特殊字符,只需在前瞻中列出所有特殊字符即可。请参考下面的代码。
const pattern1 = /(?=\D)/; // non-digit character match
const pattern2 = /(?=.*[~`!@#$%^&*()--+={}\[\]|\\:;"'<>,.?/_₹])/; // at least one special char exists

或者,假设地说,由于您的正则表达式模式已经搜索数字和字母,比如模式3中的情况,唯一不匹配的是非数字,也就是您的特殊字符。因此,您也可以找到非数字字符的匹配!就像模式4中的情况一样。
  const pattern3 =
    /^(?=.*\d)(?=.*[~`!@#$%^&*()--+={}\[\]|\\:;"'<>,.?/_₹])(?=.*[a-z])(?=.*[A-Z]).{5,10}$/;
  const pattern4 =
    /^(?=.*\d)(?=.*\D)(?=.*[a-z])(?=.*[A-Z]).{5,10}$/;

如需详细了解语法或前瞻性的解释,请阅读下面的文章。

https://medium.com/p/19fc2b2a299c


请在您的回答中添加更多的解释,以便其他人可以从中学习。同时,请在您的回答中分享所有的解释,而不是发布外部资源的链接。 - undefined
感谢您的反馈,我已经重新审查了我的回答。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接