Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex MVC模型中强密码的正则表达式_Regex_Asp.net Mvc_Model_Passwords - Fatal编程技术网

Regex MVC模型中强密码的正则表达式

Regex MVC模型中强密码的正则表达式,regex,asp.net-mvc,model,passwords,Regex,Asp.net Mvc,Model,Passwords,我需要创建一个正则表达式来验证MVC模型中的强密码。以下是我需要应用的规则: 最少7个字符 最多15个字符 4种不同类型的字符中至少有3种。 数字 小写的 大写字母 特殊(即!@$%&/=?) 以下是我迄今为止所尝试的: [DataType(DataType.Password)] [RegularExpression("([a-z]|[A-Z]|[0-9]|[\\W]){4}[a-zA-Z0-9\\W]{3,11}", ErrorMessage = "Invalid password f

我需要创建一个正则表达式来验证MVC模型中的强密码。以下是我需要应用的规则:

  • 最少7个字符
  • 最多15个字符
  • 4种不同类型的字符中至少有3种。
    • 数字
    • 小写的
    • 大写字母
    • 特殊(即!@$%&/=?)
以下是我迄今为止所尝试的:

[DataType(DataType.Password)]
[RegularExpression("([a-z]|[A-Z]|[0-9]|[\\W]){4}[a-zA-Z0-9\\W]{3,11}", ErrorMessage = "Invalid password format")]        
public string Password { get; set; }

创建一个正则表达式以任何顺序查找任意数量的不同类型的角色类有点困难,因为只要匹配一个角色,它就已经被捕获,并且您无法备份它。但是,.NET正则表达式引擎支持先行表达式。因此,您可以检查以确保字符串包含某些内容,而不实际捕获任何字符串。例如,假设您要查找任何10个字符长的字符串,其中至少包含一个字母“J”的实例。使用前瞻表达式可以很容易地做到这一点,如下所示:

(?=.*J).{10}
^(?=.*[A-Z])(?=.*\d)(?=.*[a-z])(?=.*\W).{7,15}$
(?:(?=.*[A-Z])(?=.*\d)|(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[a-z]))
(?=)
构造声明了一个先行模式。它查找的模式是
*J
,这意味着从当前位置开始,可以有任意数量的任意字符后跟字母“J”。如果在J之后出现了什么,那很好,它仍然会匹配。但是,由于它是向前看的,这些字符实际上都没有被捕获,因此模式的
{10}
捕获部分从原始位置拾取并从那里匹配。由于lookaheads根本不会移动位置,因此可以将多个lookaheads放在一行中,而不会产生任何后果,因此可以执行以下操作:

(?=.*J).{10}
^(?=.*[A-Z])(?=.*\d)(?=.*[a-z])(?=.*\W).{7,15}$
(?:(?=.*[A-Z])(?=.*\d)|(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[a-z]))
至于只应用四个字符类规则中的三个,我能想到的唯一方法就是列出所有的组合(例如,对于三个规则中的两个,A、B和C,可以匹配AB | AC | BC)。因此,例如,如果您只关注三者中的两个(例如,大写、小写和数字),您可以这样构造您的lookahead:

(?=.*J).{10}
^(?=.*[A-Z])(?=.*\d)(?=.*[a-z])(?=.*\W).{7,15}$
(?:(?=.*[A-Z])(?=.*\d)|(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[a-z]))

让四个选项中的一个支持它只不过是让选项列表变得更长而已……

Steven的答案的发展是测试所有可能的类型组合:

也可以使用给定的特殊字符

以更可读的形式

^((?=.*[A-Z])(?=.*\d)(?=.*[a-z])|
(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%&\/=?_.-])|
(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%&\/=?_.-])|
(?=.*\d)(?=.*[a-z])(?=.*[!@#$%&\/=?_.-])).{7,15}$
测试可能的四种类型组合中的任何一种,并确保有7-14种


问候

展示您尝试过的内容,并解释哪些不起作用抱歉,这里新增:)添加。建议您查看一些示例谢谢,我会看看有哪些特殊字符?不属于任何其他组的特定集合或任何UNICODE字符?谢谢,这正是我要找的!你也可以提到对比原理,可以用
^(?=[^A-Z]*[A-Z])(?=\D*\D)(?=[^A-Z]*[A-Z])(?=\w*\w)来说明。我用两种方法都做过类似的模式,但从未意识到有任何形式的效率差异。很高兴知道。你每天都能学到新东西。谢谢。我看不出这是怎么考虑到只需要三种类型。在我看来,使用这个正则表达式,所有四个都需要存在,或者…?因为正则表达式模式通常包含很多反斜杠,所以将它们都加倍可能会让人困惑。因此,正则表达式模式通常使用逐字字符串文字(以
@
符号开头)用C#编写。逐字字符串文字不使用反斜杠字符作为转义字符。因此,您可以简单地说
var pattern=@“*\d”。我把这个答案留在这里,因为我看到它有完整的正则表达式,但史蒂文破解了代码,应该得到信任。