我正在编写一个正则表达式,对使用的密码的质量进行分级。其思想是,如果密码只包含1个大写字符或至少6个大写字符,则被认为是普通密码。密码本身应该至少有8个字符长。
期望的行为:
Aaaaaaaa ->匹配
AAAAAAaa ->匹配
AAaaaaaa -> no match
我试过这样的方法:
(?=.*[A-Z]{1,1}|(?=.*[A-Z]{6,})).{8,}
这不起作用,因为它在AAaaaaaa上也是匹配的。问题是第一个正面的前瞻性,它允许2-5大写字符,但我不知道如何避免这一点。
发布于 2016-06-01 09:29:04
您的.*[A-Z]也会消耗向上的部分。在上面的字母之间使用排斥。
^(?=.{8})(?:([^A-Z]*[A-Z]){6}.*|(?1)[^A-Z]*$)它检查是否至少有6个或正好有1个上层被非上层包围。
(?=.{8})开始时的查找检查至少有8个字符(?1)是对([^A-Z]*[A-Z])的引用更多解释和regex101演示
发布于 2016-06-01 09:09:23
好的。我认为这并不是强密码的合适标准,但无论如何,让我们对这个问题进行比较:用字符串计算大写字母。
我认为使用regexp是不容易做到的。需要是一个吗?那么你应该从问题中删除php标签.
PHP解决方案:我只需过滤大写字母,然后对它们进行计数。
$caps = strlen(preg_replace('/[^A-Z]+/', '', $pass)); // number of uppercase chars in `$pass`
$mediocre = strlen($pass) != 8 || $caps > 5 || $caps < 2;
// mediocre if $pass is not exactly 8 chars long and does not contain between 2 and 5 uppercase charactershttps://stackoverflow.com/questions/37563968
复制相似问题