密码必须至少包含一个非字母字符。

8
我需要一个密码的正则表达式。密码必须至少包含8个字符。至少有一个字符必须是数字或特殊字符(不是字母)。
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 8)]
[RegularExpression(@"(?=.*\W)?(?=.*\d)", ErrorMessage = "Error message")]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }

我有一个长度验证,但需要一个正则表达式的帮助来检查密码是否包含至少一个数字或特殊字符。

有效密码的示例:

testtest85*
testtes*
testtes1
test1234*+

无效密码的示例:

testtest
testabc

3
你认为什么因素可以使一个角色变得特别? - Joey
那是什么语言?可能有不同的正则表达式风格。 - Bergi
3
@Bergi:这看起来像是在ASP.NET MVC中使用的C#语言。 - Daniel Hilgarth
1
@cashmere - etc 不是很有帮助,你所说的 etc 是指 ; , " ' ? < > { } & ^ % $ # @ ! * . / \ - + = ~ , 这个列表是否还包括不可打印字符?那些需要多次按键才能输入的高阶字符呢(如果要求,我的密码生成器可以创建这些字符)? - pstrjds
我认为,通过“特殊字符”,OP的意思是任何“非字母字符”。 - Ωmega
显示剩余2条评论
6个回答

28

使用正则表达式模式 ^(?=.{8})(?=.*[^a-zA-Z])


说明:

^(?=.{8})(?=.*[^a-zA-Z])
│└──┬───┘└──────┬──────┘
│   │           │
│   │           └ string contains some non-letter character
│   │
│   └ string contains at least 8 characters
│
└ begining of line/string
如果你想限制最大长度(比如说16),那么可以使用正则表达式模式:
^(?=.{8,16}$)(?=.*[^a-zA-Z])

6
希望我可以给它加上超过+1的分数来解释其各个部分! - Boris
2
那是一些很好的ASCII艺术。 - Sedat Kapanoglu

2

将其通过一个相当简单的正则表达式进行过滤:[^a-zA-Z]

然后单独检查其长度:

if(string.Length > 7)

3
已经在问题中使用的 StringLength(..., MinimumLength = 8) 属性应该足以强制实施最小长度,因此不需要显式地重新检查(尽管我认为这样做也无妨)。 - user743382
我尝试了你的正则表达式,但它没有起作用链接。我有长度验证。 - cashmere
在该链接上,它运行良好,返回了匹配的空格和句点。如果您只输入“Lorem”,它将返回“找到0个匹配项”。在regexpal上查看它-它会实时突出显示匹配项。 - J V
@JV regexpal使用JavaScript正则表达式,而不是.NET正则表达式。但正如您在cashmere的链接中提到的那样,它也可以工作。 - user743382
[^a-zA-Z] 也可以替换为 [\W0-9],以不将非英文字母视为特殊字符。 - Martin Brenden

1
一个简单的方法如下所示:
Match match1 = Regex.Match(<input_string>, @"(?=.{7})");   

match1.Success 确保至少有8个字符。

Match match2 = Regex.Match(<input_string>, [^a-zA-Z]);

match2.Success 确保字符串中至少有一个特殊字符或数字。

So, match1.Success && match2.Success guarantees will get what you want.

0

我尝试了Omega的示例,但它与我的C#代码不兼容。我建议使用这个替代方案:

[RegularExpression(@"^(?=[^\d_].*?\d)\w(\w|[!@#$%]){7,20}", ErrorMessage = @"Error. Password must have one capital, one special character and one numerical character. It can not start with a special character or a digit.")]

-1

像这样的表达式:

[a-zA-Z]*[0-9\+\*][a-zA-Z0-9\+\*]*

应该可以正常工作(显然插入任何其他特殊字符您想要允许或使用^运算符来匹配除字母/数字以外的任何内容);不需要使用复杂的环顾。如果您只想允许某个已知为“安全”的特殊字符子集,并禁止所有其他字符,这种方法是有意义的。

如果您想包含除您知道为“不安全”的某些字符之外的所有特殊字符,则使用类似以下内容会很有意义:

\w[^\\]*[^a-zA-Z\\][^\\]*

在这种情况下,您明确禁止在密码中使用反斜杠,并允许任何组合,其中至少有一个非字母字符。
上述表达式将匹配包含字母和至少一个数字或+,*的任何字符串。至于“长度为8”的要求,实际上没有必要使用正则表达式进行检查。

2
如果你列出密码中允许的字符,那么你就阻止了我使用更安全的密码。你应该从另一个角度来看待它(就像J V的回答一样):如果任何字符都不是字母,则密码通过检查。 - user743382
单词。编辑后反映出来。另外,我认为J V的回答在这种情况下可能更好。我试图想出一个正则表达式,如果有效,则匹配整个密码,但这并不是必要的。我想在这里只检查密码的任何部分是否不是字母就足够了,就像J V建议的那样。 - Moritz

-1
  function randomPassword(length) {
        var chars = "abcdefghijklmnopqrstuvwxyz#$%ABCDEFGHIJKLMNOP1234567890";
        var pass = "";
        for (var x = 0; x < length; x++) {
            var i = Math.floor(Math.random() * chars.length);
            pass += chars.charAt(i);
        }
        var pattern = false;
        var passwordpattern = new RegExp("[^a-zA-Z0-9+]+[0-9+]+[A-Z+]+[a-z+]");
        pattern = passwordpattern.test(pass);
        if (pattern == true)
            { alert(pass); }
        else
         { randomPassword(length); }
    }

尝试使用以下代码创建至少包含一个特殊字符的随机密码


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