如何编写正则表达式以查看表达式中是否至少传递了一些语句

时间:2016-06-09 18:58:37

标签: regex

我是正则表达式的新手,并且想知道如何编写一个正则表达式,如果表达式中的某些语句通过,它将会通过。

例如我有这个正则表达式

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$
如果字符串有

,则匹配

  • 1个小写字符,
  • 1个大写字符,
  • 1位,
  • 1个符号。

如果4个条件中的至少3个条件在任何顺序中都为真,是否有可能通过正则表达式?

(即如果字符串有1个较低,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