密码的正则表达式如何来写?
我需要一个正则表达式来检查密码:
密码至少包含八个字符、至少包含一个数字、同时包含小写字母和大写字母以及特殊字符,例如#
,?
,!
)
不能是旧密码或包含用户名,"password"
或"websitename"
这里是我的验证表达式,用于限制:八个字符,包括一个大写字母,一个小写字母和一个数字或特殊字符。
(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"
那么,如何写一个正则,限制密码必须是八个字符,包括一个大写字母,一个特殊字符和字母数字字符?
最佳解决思路
至少八个字符,至少一个字母和一个数字:
"^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$"
至少八个字符,至少一个字母,一个数字和一个特殊字符:
"^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$"
最少八个字符,至少一个大写字母,一个小写字母和一个数字:
"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$"
至少八个字符,至少一个大写字母,一个小写字母,一个数字和一个特殊字符:
"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}"
最少八个最多十个字符,至少一个大写字母,一个小写字母,一个数字和一个特殊字符:
"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,10}"
次佳解决思路
可以使用这个正则表达式:
^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$
这个正则表达式将强制执行这些规则:
-
至少一个大写字母English letter,
(?=.*?[A-Z])
-
至少一个小写英文字母,
(?=.*?[a-z])
-
至少有一位数字,
(?=.*?[0-9])
-
至少有一个特殊字符,
(?=.*?[#?!@$%^&*-])
-
最小八个长度
.{8,}
(带锚)
第三种解决思路
正则表达式没有AND运算符,所以编写匹配有效的密码的正则表达式相当困难,特别是当有效性被某些东西AND
别的东西等定义时…
但是,正则表达式确实有一个OR运算符,所以只需应用DeMorgan的定理,并编写一个与无效密码相匹配的正则表达式:
任何少于八个字符或任何没有数字或任何没有大写字母或任何没有小写字母或任何没有特殊字符的任何字符串。
所以:
^(.{0,7}|[^0-9]*|[^A-Z]*|[^a-z]*|[a-zA-Z0-9]*)$
如果能匹配上这个正则表达式的话,这是一个无效的密码。
第四种思路
对最佳答案的一个小小的改进:由于特殊字符仅限于键盘中的特殊字符,因此可用于表达任何特殊字符:
^(?=.*?[A-Z])(?=(.*[a-z]){1,})(?=(.*[\d]){1,})(?=(.*[\W]){1,})(?!.*\s).{8,}$
这个正则表达式将强制执行这些规则:
-
至少一个大写英文字母
-
至少一个小写英文字母
-
至少一位数字
-
至少一个特殊字符
-
最少八个字符
第五种思路
在我的环境中,按照最佳答案来做,我遇到了一些困难。例如,对字符如;
或[
验证失败。我不想白名单列举我的特殊字符,所以我用[^\w\s]
作为测试 – 只是放置匹配非字符(包括数字)和非空格字符。总而言之,这个做法对我来说比较有效…
-
至少
8
字符 -
至少
1
数字字符 -
至少
1
小写字母 -
至少
1
大写字母 -
至少
1
特殊字符
/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[^\w\s]).{8,}$/
JSFiddle Link – 简单的涵盖各种情况的demo
第六种思路
导入JavaScript文件jquery.validate.min.js
。
就可以使用如下方法:
$.validator.addMethod("pwcheck", function (value) {
return /[\@\#\$\%\^\&\*\(\)\_\+\!]/.test(value) && /[a-z]/.test(value) && /[0-9]/.test(value) && /[A-Z]/.test(value)
});
这个正则表达式可以表达:
-
至少一张大写英文字母
-
至少一个小写英文字母
-
至少一位数字
-
至少一个特殊字符
第七种思路
满足如下条件:
-
最少六个字符
-
至少有一个大写字符
-
至少一个小写字符
-
至少一个特殊字符
正则表达式:
"/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&.])[A-Za-z\d$@$!%*?&.]{6, 20}/"
满足如下条件,且有可选特殊字符:
-
至少一个特殊字符
-
至少一个数字
-
特殊字符是可选的
-
最少6个字符,最多16个字符
正则表达式:
"/^(?=.*\d)(?=.*[a-zA-Z]).{6,20}$/"
如果不需要最小和最大条件,可以删除.{6, 16}
-
6是最小字符数限制
-
20是最大字符限制
-
?=表示匹配表达式
第八种思路
需要满足的条件,以及对应的正则表达式:
Conditions: 1] Min 1 uppercase letter.
2] Min 1 lowercase letter.
3] Min 1 special character.
4] Min 1 number.
5] Min 8 characters.
6] Max 30 characters.
Regex: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[#$@!%&*?])[A-Za-z\d#$@!%&*?]{8,30}$/
第九种思路
根据你的需要,下面这个正则表达式应该能正常工作的:
^(?=(.*\d){1})(.*\S)(?=.*[a-zA-Z\S])[0-9a-zA-Z\S]{8,}
只需创建一个字符串变量,分配模式,并创建一个布尔方法,如果模式匹配正确则返回true,否则返回false。
示例:
String pattern = "^(?=(.*\d){1})(.*\S)(?=.*[a-zA-Z\S])[0-9a-zA-Z\S]{8,}";
String password_string = "Type the password here"
private boolean isValidPassword(String password_string) {
return password_string.matches(Constants.passwordPattern);
}
第十种思路
试试这个正则表达式:
^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])[a-zA-Z0-9@#$%^&+=]*$
这个正则表达式对我来说非常完美。
function myFunction() {
var str = "c1TTTTaTTT@";
var patt = new RegExp("^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])[a-zA-Z0-9@#$%^&+=]*$");
var res = patt.test(str);
console.log("Is regular matches:", res);
}