正则表达式用于字母数字混合密码,至少包含1个数字和1个字符。

3

需要帮助设计一个包含至少1个数字和字符,长度在8-20个字符之间的密码正则表达式。

我已经有了以下正则表达式,但它似乎不能完全满足要求(它也没有长度要求):

^[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*$
6个回答

10

如果你查看这个MSDN链接,它给出了一个密码验证正则表达式的示例,以及(更具体地)如何在ASP.NET中使用它。

针对你想要实现的目标,以下代码应该可以胜任:

    (?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,20})$

该密码要求至少包含一个数字和一个字母字符,不包含任何特殊字符,长度在8到20个字符之间。


澄清一下,第一个“负向先行断言”,即“(?!^[0-9]*$)”,负责确保至少有一个字母字符,第二个则是确保至少有一个数字,最后的“^([a-zA-Z0-9]{8,20})$”表示我们需要8-20个字母数字。 - jdg

3
为什么不使用一些简单的函数来检查?
checkPasswordLength( String password);
checkPasswordNumber( String password);

也许还需要检查是否有相同字符重复出现并连续出现的情况。

1
输入验证是正则表达式非常擅长的领域,使用正则表达式可以为您提供更多未来的灵活性。 - Adam Robinson
6
如果你需要使用不匹配的向前预查等操作,正则表达式并不是最好的选择。如果你确实需要使用正则表达式,也没有必要把所有东西都强行塞到一个表达式里面。对于明智的回答点个赞。 - John Kugelman
@Adam Robinson - 谁说checkPasswordLength()函数不能在函数内使用正则表达式呢?你完全可以在这个解决方案中利用它们的优势。 - ceejayoz
3
@ceeja,@John:正则表达式的灵活性和速度很大程度上来自于能够在单个检索中(至少从开发角度)检查事物。将其分成两个语句,无论是显式地还是通过封装多个函数,都会减弱它的效果。对于如此简单的东西,它似乎也被过度设计了。我不明白使用正则表达式验证输入为什么会被认为是“疯狂”的。 - Adam Robinson

1
^(?=.{8,20}$)(?=.*[0-9])(?=.*[a-zA-Z]).*

? :)


看起来末尾的 .* 甚至会匹配特殊字符。 - bmb

0

这段代码是用于JavaScript的

// *********** ALPHA-Numeric check ***************************
function checkAlphaNumeric(val)
{
    var mystring=new String(val)

    if(mystring.search(/[0-9]+/)==-1) // Check at-leat one number
    {
        return false;
    }
    if(mystring.search(/[A-Z]+/)==-1 && mystring.search(/[a-z]+/)==-1) // Check at-leat one character
    {
        return false;
    }
}

0

类似这样的代码可能更符合您的需求。(尽管我没有测试过。)

Regex test = new Regex("^(?:(?<ch>[A-Za-z])|(?<num>[9-0])){8,20}$");
Match m = test.Match(input);
if (m.Success && m.Groups["ch"].Captures.Count > 1 && m.Groups["num"].Captures.Count > 1)
{
  // It's a good password.
}

0

使用一些简单的字符串函数进行验证,是否比试图将难以验证的正则表达式塞入其中更好呢?


有时候,正则表达式在这种(密码?)验证方面更容易。特别是因为您可以使用Asp.Net正则表达式验证器 :) - cwap
1
Sanjay,输入验证是正则表达式最常见的应用之一,使用它们可以在验证要求发生更改时提供更多的灵活性。 - Adam Robinson
2
正则表达式验证无法告诉您失败输入的具体问题,除了“这与正则表达式不匹配”,因此您无法告诉用户他做错了什么。在许多情况下,这是可以接受的。 - Robert Rossney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接