我是正则表达式的新手,并且想知道如何编写一个正则表达式,如果表达式中的某些语句通过,它将会通过。
例如我有这个正则表达式
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$
如果字符串有,则匹配
如果4个条件中的至少3个条件在任何顺序中都为真,是否有可能通过正则表达式?
(即如果字符串有1个较低,1个较高,1个符号或1个较高,1个数字,1个符号等,则会通过)。
感谢任何帮助!
答案 0 :(得分:1)
我可以提出的最佳方法是捕获捕获组中的每种类型的字符,并确保至少3/4个捕获组具有值(如果该组无法匹配任何内容,则应该是一个空字符串)。
^(?:([a-z])|([A-Z])|(\d)|(_|[^\w]))+$
您还可以添加正向前瞻以确保密码具有所需的长度(例如8到32个字符)。
^(?=.{8,32}$)(?:([a-z])|([A-Z])|(\d)|(_|[^\w]))+$
修改:([\W_])
相当于(_|[^\w])
。放" W "在大写反转它感觉(匹配所有非单词字符)。此外,使用单个字符类比交替(more details here)
如果您愿意使用javascript,我会在" Regular Expression cookbook second edition "中修改一个功能。为了我的网站的需要:
var PASSWORD_RANKING = {
TOO_SHORT: 0,
WEAK: 1,
MEDIUM: 2,
STRONG: 3,
VERY_STRONG: 4
};
/**
* Take a password and returns it's ranking
* based of the strength of the password (length, numeric character, alphabetic character, special character, etc.)
*
* @param password String
* @param minLength Int
*
* @return Int
*/
function rankPassword(password, minLength){
var rank = PASSWORD_RANKING.TOO_SHORT;
var score = 0;
if (typeof minLength !== 'number' || minLength < 6){
minLength = 8;
}
if (typeof password === 'string' && password.length >= minLength){
if (/[A-Z]/.test(password)){ score++;}
if (/[a-z]/.test(password)){ score++;}
if (/[0-9]/.test(password)){ score++;}
if (/[_~!@.#$%^&]/.test(password)){ score++;}
score += Math.floor((password.length - minLength) / 2);
if (score < 3){
rank = PASSWORD_RANKING.WEAK;
}
else if (score < 4){
rank = PASSWORD_RANKING.MEDIUM;
}
else if (score < 6){
rank = PASSWORD_RANKING.STRONG;
}
else {
rank = PASSWORD_RANKING.VERY_STRONG;
}
}
return rank;
}
4.19节介绍了许多强制执行密码强度的正则表达式。您可以在线查看所有代码示例: http://examples.oreilly.com/0636920023630/Regex_Cookbook_2_Code_Samples.html