我需要一个正则表达式来检查:

密码至少包含八个字符,包括至少一个数字,包括小写和大写字母以及特殊字符,例如#、?、!。

它不能是您的旧密码,也不能包含您的用户名、“密码”或“网站名称”

这是我的验证表达式,用于八个字符,包括一个大写字母、一个小写字母和一个数字或特殊字符。

(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"

如果密码必须是八个字符,包括一个大写字母、一个特殊字符和字母数字字符,我怎么写?


当前回答

保持简单和直接:

这对你来说总是有好处的。

正则表达式:^(.{0,7}|[^a-z]{1,}|[^a-z]{0,}|[^\d]{2,})$|[\s]

如果您的密码与上面的正则表达式匹配,则该密码无效。

如果没有匹配项,则您的密码有效,并且包含至少8个字符、一个大写字母、一个小写字母和一个符号或特殊字符。它也不包含空格、制表符或换行符。

Regex细分

.{0,7}-如果密码包含0到7个字符,则匹配。[^a-z]{1,}-匹配,如果找不到小写[^A-Z]{1,}-如果找不到大写字母,则匹配[^\d]{1,}-如果找不到数字(介于[0-9]之间),则匹配[\s]-如果找到空格、制表符或换行符,则匹配。

使用这种方法,在允许的符号方面没有限制或限制。如果要限制为允许的符号数,只需将[^\W]更改为[^YourSymbols]即可。

其他回答

您可以将此正则表达式与多个前瞻断言(条件)一起使用:

^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$

此正则表达式将强制执行以下规则:

至少一个大写英文字母,(?=.*?[A-Z])至少一个小写英文字母(?=.*?[a-z])至少一个数字,(?=.*?[0-9])至少有一个特殊字符(?=.*?[#?!@$%^&*-])长度至少为8。{8,}(带锚)

正则表达式没有AND运算符,因此很难编写与有效密码匹配的正则表达式,因为有效性是由“AND”或“AND”定义的。。。

但是,正则表达式确实有一个OR运算符,所以只需应用DeMorgan定理,并编写一个匹配无效密码的正则表达式:

任何少于八个字符的东西,任何没有数字的东西,或者任何没有大写字母的东西,或任何没有小写字母的东西或者任何没有特殊字符的东西。

So:

^(.{0,7}|[^0-9]*|[^A-Z]*|[^a-z]*|[a-zA-Z0-9]*)$

如果有任何内容与此匹配,则是无效密码。

如果您不喜欢使用正则表达式。因此,本模块帮助很大:https://www.npmjs.com/package/password-validator

var passwordValidator = require('password-validator');
 
// Create a schema
var schema = new passwordValidator();
 
// Add properties to it
schema
.is().min(8)                                    // Minimum length 8
.is().max(100)                                  // Maximum length 100
.has().uppercase()                              // Must have uppercase letters
.has().lowercase()                              // Must have lowercase letters
.has().digits(2)                                // Must have at least 2 digits
.has().not().spaces()                           // Should not have spaces
.is().not().oneOf(['Passw0rd', 'Password123']); // Blacklist these values
 
// Validate against a password string
console.log(schema.validate('validPASS123'));
// => true
console.log(schema.validate('invalidPASS'));
// => false

演示:

函数password_check(){pass=document.getElementById(“密码”).value;console.log(通过);正则表达式=/^(?=.*[a-z])(?=..*[a-z])((?=*.*\d)(?=.*[@$!%*?&])[a-Za-z\d@$!%*?&]{8,}$/;if(regex.exec(pass)==null){警报('有效密码!')}其他{console.log(“有效”);}}<input type=“text”id=“password”value=“Sample@1"><input type=“button”id=“submit”onclick=“password_check()”value=“submit“>

我在这里发现了很多问题,所以我自己做了。

这里是它的荣耀,有测试:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*([^a-zA-Z\d\s])).{9,}$

https://regex101.com/r/DCRR65/4/tests

需要注意的事项:

不使用\w,因为其中包含我正在测试的_。我在匹配符号时遇到了很多麻烦,但没有匹配行的结尾。没有具体指定符号,这也是因为不同地区的键盘上可能有不同的符号。