6个字符或以上的弱密码,至少包含1位数字

本文关键字:包含 数字 1位 密码 字符 6个 | 更新日期: 2023-09-27 18:05:31

我想为密码创建正则表达式,长度至少为6个字符,其中至少包含1个数字。这是我想到的表达式:

Regex regEx = new Regex(@"^?='d.{6,}$");

但这似乎不起作用。有人能告诉我为什么吗?

我猜它说的是在开始和结束之间,它执行向前看,看看是否有数字出现在密码中。它出现了,然后说任何东西都可以重复{6},说至少6个字符。但这似乎行不通。有人能纠正我吗?

更新:应Albin Sunnanbo的要求,我已将标题从强密码更改为弱密码

6个字符或以上的弱密码,至少包含1位数字

正则表达式不太适合"在任何位置至少包含x "这样的要求。

试试这个:

bool result = (password.Length >= 6) && password.Any(char.IsDigit);

您的非捕获组缺少括号。试试这个:

^(?=.*'d).{6,}$

验证一些基本功能的小测试:

    [TestMethod]
    public void CheckAtLeastNotSuperWeakPassword()
    {
        var r = new Regex(@"^(?=.*'d).{6,}$");
        Action<string, bool> a = (s, b) =>
        {
            Assert.AreEqual(b, r.IsMatch(s), s);
        };
        a("", false);
        a("a", false);
        a("abcdef", false);
        a("abcdefg", false);
        a("1", false);
        a("abc1e", false);
        a("abc1ef", true);
        a("1bcaef", true);
        a("cbcae1", true);
        a("cbcae1wqd32", true);
    }

通过RegEx进行密码验证有一个关于该主题的体面讨论。

你可以使用:

^'w*(?='w*'d)(?='w*.{6,})'w*$

我不认为这是正则表达式的问题。如果您对密码字符串有一组标准,只需编写代码来检查这些标准。

从长远来看,你最终会得到一个更易于表达、更易于维护的解决方案。

pseudocode-ish

 If pass <> confirmPass Then
        FailPasswordCheck("Password and confirmation did not match.")
        Return False
    End If
    If pass.Length < 7 Then
        FailPasswordCheck("Password must be at least 7 characters long.")
        Return False
    End If
    If Not ContaintsNumericChar(pass) Then
        FailPasswordCheck("Password must have at least 1 number.")
        Return False
    End If

这是一个很简单的例子:

(?=.*/d).{6}

解释
(?=.*/d)       #a look around for a digit preceded by any number of chars.
.{6}           #6 chars

注意:我不包括开始(^),字符串结束($)或超过6个字符({6,}),因为它们对原始问题不是严格必要的。