用于复杂密码验证的正则表达式

kyl*_*leb 2 c# regex passwords

我查看了stackoverflow等,但是没有找到一个好的答案.正则表达式是否支持编写这样的规则?如果是这样,那里有任何正则表达专家可以帮助我写这篇文章,我是正则表达式的一个重要新手,并且在时间紧迫中......

我知道我可以使用c#char,number方法在c#中使用手动函数来执行此操作,但是如果可以的话,我想使用正则表达式.

要求:

  • 至少8个字符
    • 2个字母
    • 2位数
    • 1大写
    • 1小写
    • 1符号

Ode*_*ded 18

对于具有所有这些检查的密码,编写简单的验证例程要好得多.

正则表达式似乎不是针对此特定问题的最佳(或最具可扩展性)解决方案.

if(password.Length < 8)
  return false;

var letters = 0;
var digits = 0;
var uppers = 0;
var lowers = 0;
var symbols = 0;
foreach(var ch in password)
{
   if (char.IsLetter(ch)) letters++;
   if (char.IsDigit(ch)) digits++;
   ....
} 

if(letters < 2) return false;
...
Run Code Online (Sandbox Code Playgroud)


Ani*_*dha 18

你可以使用这个正则表达式

^(?=(.*\d){2})(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z\d]).{8,}$
    ---------  --------------------- --------------- -----
        |               |                    |          |->match 8 or more characters
        |               |                    |->match further only if theres anything except letter or digit
        |               |->match further only if there is an upper-lower case letter
        |
        |->match further only if there are two digits anywhere
Run Code Online (Sandbox Code Playgroud)

演示

  • 你还在编辑你的答案是有原因的.:) (4认同)
  • @kyleb - 这个的一个缺点是你无法告诉用户*为什么*他们的密码无效,你只能告诉他们不是. (4认同)

Rot*_*tem 5

我建议采用 Oded 的回答方式,但我认为在这种情况下,LINQ 是一种更具可读性和明确性的验证机制。

string p = "psW%Rd32";
return p.Length >= 8 &&
    p.Count(c => char.IsDigit(c)) >= 2 &&
    p.Count(c => char.IsUpper(c)) >= 1 &&
    p.Count(c => char.IsLower(c)) >= 1) ...
Run Code Online (Sandbox Code Playgroud)

  • 尽管我喜欢它,但您_are_ 对字符串进行了多次迭代(每个`Count` 一次)。 (2认同)
  • 我知道你会选择性能。:) 我认为这是用于文本框的实时验证,而不是事后迭代数千个密码。在这种情况下,我们实际上迭代的字符不超过 1-2 打,在过去 15 年的任何 CPU 上都不会感受到任何性能优势。 (2认同)