密码验证正则表达式:要求和禁止某些字符

Password validation regex: require and forbid certain characters

我有一个带有 jQuery 验证和 System.ComponentModel.DataAnnotations

的 MVC 表单

问题是如果我在密码文本框中输入 & 然后 jQuery 和 MVC Model.Isvalid 允许它,即使它不是允许的字符之一。

我曾尝试在 Google 上搜索此内容,但我得到的结果与该问题无关。即 JavaScript:客户端与服务器端验证 - 堆栈溢出

下面是我的正则表达式,以防我弄错了。

RegularExpression("^((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,10})", 
  ErrorMessage = "{0} must be between 6 and 10 characters and have at least 1 upper case letter, 1 lower case letter, 1 number and contain either @#$%")

您示例中的模式 ^((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,10}) 使用正向前瞻来确保输入字符串中存在某些字符 类 但它不会以任何方式阻止其他类型的字符出现。每个前瞻组都以 .* 开头,这实际上允许任何内容,因此 & 或任何其他字符实际上都将在输入字符串中被接受,并且将另外强制执行前瞻表示的任何内容。

换句话说,这种使用仅正前瞻的方法将使某些类型的字符需要,但它不会使任何字符不允许.

为了克服这个问题,您可以简单地添加另一个前瞻组,但这次是负组:

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

此外,请注意以字符串终止符 $ 结束模式(您的示例中没有)。否则,正则表达式引擎将为长度超过 10 个字符的输入生成匹配项。

请参阅此处 example