【问题标题】:Password must have at least one non-alpha character [duplicate]密码必须至少有一个非字母字符[重复]
【发布时间】:2012-08-16 19:22:13
【问题描述】:

我需要一个正则表达式作为密码。密码必须至少包含 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

【问题讨论】:

  • 是什么让一个角色对你来说特别?
  • 那是什么语言?可能有不同的正则表达式风格。
  • 为什么要使用前瞻?此外,环视不能是可选的。
  • @Bergi:这看起来像 ASP.NET MVC 中的 C#
  • @cashmere - etc 没有帮助,etc 你的意思是 ; , " ' ? < > { } & ^ % $ # @ ! * . / \ - + = ~ , 这个列表是否还包括不可打印的字符?需要多次击键才能输入的高阶字符(我的密码生成器会根据要求创建这些字符)呢?

标签: c# regex asp.net-mvc validation


【解决方案1】:

使用正则表达式模式^(?=.{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])

【讨论】:

  • 希望我可以添加超过 +1 来解释它的各个部分!
  • 那是一些不错的 ascii 艺术。
【解决方案2】:

通过一个相当简单的正则表达式运行它:[^a-zA-Z]

然后分别检查它的长度:

if(string.Length > 7)

【讨论】:

  • 问题中的StringLength(..., MinimumLength = 8) 属性应该 足以强制执行最小长度,因此不需要明确地重新检查(尽管它可以不疼,我想)。
  • 我试试你的正则表达式,但它不起作用link。我有长度验证。
  • 在那个链接上它工作正常,它返回它匹配的空格和句点。如果您只输入“Lorem”,它将返回“找到 0 个匹配项”。在regexpal 上查看它 - 它会即时突出显示匹配项
  • @JV 正则表达式使用 JavaScript 正则表达式,而不是 .NET 正则表达式。但正如你提到的,在羊绒的链接上,它也有效。
  • [^a-zA-Z] 也可以替换为 [\W0-9] 以不将非英文字母视为特殊字母
【解决方案3】:

一个简单的方法是这样的:

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.

【讨论】:

    【解决方案4】:

    我尝试了 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.")]
    

    【讨论】:

      【解决方案5】:

      这样的表达式:

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

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

      如果你想包含除某些你知道是“不安全”的特殊字符之外的所有特殊字符,那么使用以下内容是有意义的:

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

      在这种情况下,您明确禁止在密码中使用反斜杠,并允许与至少一个非字母字符进行任何组合。

      上面的表达式将匹配任何包含字母和至少一个数字或+、*的字符串。至于“长度为 8”的要求,确实没有理由使用正则表达式进行检查。

      【讨论】:

      • 如果您在密码中列出允许的字符,您将阻止我使用更安全的密码。您应该反过来看(如 JV 的回答):如果 any 字符是 not 字母,则密码通过检查。
      • 字。编辑以反映这一点。另外,无论如何,我认为 J V 的答案在这种情况下可能会更好。我试图考虑一个匹配整个密码的正则表达式(如果有效),但这并不是必需的。我想这里只要检查密码的任何部分是否不是字母就足够了,正如 J V 建议的那样。
      【解决方案6】:
        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); }
          }
      

      试试这个来创建至少有一个特殊字符的随机密码

      【讨论】:

        猜你喜欢
        • 2017-02-06
        • 1970-01-01
        • 2021-04-21
        • 2016-02-08
        • 2015-01-18
        • 1970-01-01
        • 2021-09-08
        相关资源
        最近更新 更多