C# 我可以编写正则表达式来检查密码中的某些条件吗?

C# 我可以编写正则表达式来检查密码中的某些条件吗?,c#,.net,regex,validation,passwords,C#,.net,Regex,Validation,Passwords,我正在研究一个要求,其中我必须创建一个强大的密码。必须满足以下条件: ->它应该是大写字母、小写字母、数字和特殊字符的组合 我能为这个写一个正则表达式吗?如果是,怎么做?不太可能。正则表达式用于搜索/解析字符串,而不是生成字符串。是否有可能以某种方式利用它们,但代码的根不能(或至少不应该)依赖于正则表达式 正则表达式可用于验证特定密码是否满足某些要求(即询问已生成的密码是否为强密码)。因此,一种可能的策略是生成随机密码,并不断尝试,直到验证为强密码为止。那将是一个非常糟糕的主意。您最好编写生成算

我正在研究一个要求,其中我必须创建一个强大的密码。必须满足以下条件:
->它应该是大写字母、小写字母、数字和特殊字符的组合


我能为这个写一个正则表达式吗?如果是,怎么做?

不太可能。正则表达式用于搜索/解析字符串,而不是生成字符串。是否有可能以某种方式利用它们,但代码的根不能(或至少不应该)依赖于正则表达式

正则表达式可用于验证特定密码是否满足某些要求(即询问已生成的密码是否为强密码)。因此,一种可能的策略是生成随机密码,并不断尝试,直到验证为强密码为止。那将是一个非常糟糕的主意。您最好编写生成算法,这样它首先总是生成一个强密码


如果您的问题是是否可以使用正则表达式验证用户生成的密码,请相应地更改问题,因为如果是这样,则答案是“是”。

如果您使用FormsAuthentication,请在配置提供程序时尝试使用
PasswordStrengthRegularPression
属性


例如,要验证至少8个字符的密码:

if (Regex.IsMatch(subjectString, 
    @"^               # Start of string
    (?=.*\p{Lu})      # Assert at least one uppercase letter
    (?=.*\p{Ll})      # Assert at least one lowercase letter
    (?=.*\d)          # Assert at least one digit
    (?=.*[^\p{L}\d])  # Assert at least one other character
    .{8,}             # Match at least 8 characters
    $                 # End of string",             
    RegexOptions.IgnorePatternWhitespace))

对。使用
System.Text.RegularExpressions.Regex.IsMatch(字符串输入,字符串模式)
方法

if( Regex.IsMatch(pw,"[a-z]") &&
    Regex.IsMatch(pw,"[A-Z]") &&
    Regex.IsMatch(pw,"[0-9]") && 
    Regex.IsMatch(pw,"[!@#\$%\^&\*\(\)]"))

您可以为此编写正则表达式,几乎可以编写任何内容

我相信这会奏效:

^.*(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).*$
我在我的项目中使用了这一点,但增加了一个长度要求,我强烈建议如下:

^.*(?=.{10,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).*$

请不要对密码设置一系列任意的限制。有更多的限制,。抱歉,如果我的评论不太礼貌。。。无论如何,它有点期待你在提问之前做基本的网络搜索。也就是说,会给你一些不错的起始链接。将您尝试过但不符合要求的样本与测试用例一起使用会使问题变得更好。问题陈述在创建和验证方面存在冲突。为什么我的问题得到了-1?我不应该为此得到-1分!这太疯狂了!!我同意古鲁克的观点。编写规范的人应该会收到很多反对票,这一点已经提出,但编码员可能别无选择,这个问题是正确的。标题似乎表明他问的是验证问题,而不是密码的生成问题。@TimPietzcker,但它说的是创建。含糊不清,但我们正在研究它。这个正则表达式效率很低。至少在开始时删除
*
,否则您将在验证失败的字符串上遇到灾难性的回溯。我喜欢您通过查找非字母或数字来处理特殊字符的方式。但在实际应用中,这也会导致大量ASCII字符,这可能会破坏程序或数据库,这取决于很多事情。对于密码,我通常使用一个字符类来允许我希望它允许的内容,通常是键盘特殊字符,而不仅仅是任何东西。e、 g.:
[-
~!@$%^&*([u+={}}[]\:,./?]`,我通常不允许在UN或PW中引用,只是旧的注射安全习惯,可能不是所有技术都需要的。呜呜,我在字符类中打了一个勾,打破了它,哈哈。
[-~!@$%&*([u+={}-\[\\\\\\[-~!@$%&&&----+++-------------------/-----------\\\\\\[\\\\\\\\\\\\\[+-----------------“任何事”有时都会有不想要的结果,劳尔