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

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

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

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

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

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


当前回答

@ClasG已经建议:

^(?=\S*[a-z])(?=\S*[A-Z])(?=\S*\d)(?=\S*[^\w\s])\S{8,}$

但它不接受_(下划线)作为特殊字符(例如Aa12345_)。

一个改进的方法是:

^(?=\S*[a-z])(?=\S*[A-Z])(?=\S*\d)(?=\S*([^\w\s]|[_]))\S{8,}$

其他回答

另一种选择是使用否定字符类在前瞻断言中使用对比度,可以选择匹配任何字符,但在匹配应该匹配的字符之前列出的字符除外。

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

查看正则表达式演示

在部分情况下,模式匹配:

^字符串的开头(?=[^A-Z\n]*[A-Z])正向前瞻,断言除A-Z或换行外的任何字符的0+倍。然后匹配字符a-Z(?=[^a-z\n]*[a-z])字符a-z的方法相同(?=[^0-9\n]*[0-9])数字0-9的方法相同(?=[^#?!@$%^&*\n-]*[#?!@$%^&*-])对于您认为特殊的字符,使用相同的方法.{8,}匹配除换行符以外的任何字符的8倍或更多倍$字符串结尾

笔记

点也可以与空格匹配。如果您不想允许匹配空间,那么。{8,}可以更改为\S{8}以匹配8个或更多非空白字符使用任意一种。或/S可以匹配比前瞻断言中指定的字符更多的字符。如果只想匹配断言中使用的字符,可以进行更改。{8,}使用字符类仅匹配允许的字符[#?!@$%^&*A-Za-z0-9-]{8、}

常量正则表达式=/^(?=[^A-Z\n]*[A-Z])(?=[^A-Z\n]*[A-Z])((?=[^0-9\n]*[0-9])(!=[^#?!@$%^&*\n-]*[#?!@$%^&*-])。{8,}$/;[“abcA1#!A”,“#!asdfSFD1;”,“#a f F1;”,"1111111111",“aaaaaaa”,"11111111",“aaaaaaa”,"########",“aA1#”].对于每个(s=>console.log(正则表达式测试)`匹配-->${s}`:`不匹配-->$}`));

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

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

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

So:

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

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

使用这个,

((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%?=*&]).{8,20})

它将验证至少一个小写、一个大写、一个数字以及(!、@、#、$、%、?、=、*、&)的特殊字符。

最小长度为8,最大长度为20

"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[\\\\`~!@#$%^&/*()_+=[{}]\\[\\]|\\:;'\"<>.,?/-]).{8,}$";

如果您不喜欢使用正则表达式。因此,本模块帮助很大: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