正则表达式检查密码是否为"8个字符,包括1个大写字母,1个特殊字符,字母数字字符"

Ran*_*air 101 c# regex

我想要一个正则表达式来检查

密码必须是八个字符,包括一个大写字母,一个特殊字符和字母数字字符.

这是我的验证表达式,它包含八个字符,包括一个大写字母,一个小写字母和一个数字或特殊字符.

(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"
Run Code Online (Sandbox Code Playgroud)

我怎么能写一个密码必须是八个字符,包括一个大写字母,一个特殊字符和字母数字字符?

npi*_*nti 129

你所追求的正则表达式很可能是巨大的,而且对于那些不熟悉正则表达式的人来说,这是一个噩梦.

我认为打破你的正则表达式并且一次做一点就更容易了.它可能需要做更多的工作,但我很确定维护它并调试它会更容易.这还可以让您向用户提供更多定向错误消息(除此之外Invalid Password),这样可以改善用户体验.

从我所看到的你是非常流利的正则表达式,所以我认为给你正则表达式做你需要的将是徒劳的.

看到你的评论,我就是这样做的:

  • 必须是八个字符长:你不需要正则表达式.使用该.Length属性应该足够了.

  • 包括一个大写字母:您可以使用[A-Z]+正则表达式.如果字符串包含至少一个大写字母,则此正则表达式将产生true.

  • 一个特殊字符:您可以使用\W哪个匹配任何不是字母或数字的字符,否则,您可以使用类似[!@#]的字符来指定特殊字符的自定义列表.不过,请注意字符如$,^,()是在正则表达式语言的特殊字符,所以需要进行转义像这样:\$.简而言之,你可以使用\W.

  • 字母数字字符:使用\w+应匹配任何字母和数字以及下划线.

有关更多信息,请查看教程.

  • +1 Regex功能强大,但并不意味着解决宇宙中的任何问题 (34认同)
  • @RaniaUmair:我认为你的评论证明了我的观点.我建议你像我指定的那样分解它. (3认同)
  • 我没有写这个我自己从谷歌亲爱的朋友那里得到它 (2认同)
  • 来不及回应;但这种方法也允许告诉用户他们出错的确切位置.. 包含所有内容的正则表达式只能说明要求是什么.. 将其分解为多个“如果”将让您告诉用户:“哦,等等,你至少需要有一个符号”等等......更用户友好的方式。 (2认同)

mmd*_*bas 102

(                   # Start of group
    (?=.*\d)        #   must contain at least one digit
    (?=.*[A-Z])     #   must contain at least one uppercase character
    (?=.*\W)        #   must contain at least one special symbol
       .            #     match anything with previous condition checking
         {8,8}      #        length is exactly 8 characters
)                   # End of group
Run Code Online (Sandbox Code Playgroud)

在一行中:

((?=.*\d)(?=.*[A-Z])(?=.*\W).{8,8})
Run Code Online (Sandbox Code Playgroud)

资料来源:

  • 因为它由12个字符组成 (58认同)
  • 您可以使用{8}缩短它以匹配8个字符 (6认同)

Mat*_*ans 34

这么多答案......一切都很糟糕!

正则表达式没有AND运算符,所以编写与有效密码匹配的正则表达式非常困难,当有效性由某些东西和其他东西定义时,其他东西......

但是,正则表达式确实有一个OR运算符,所以只需应用DeMorgan的定理,并编写一个匹配无效密码的正则表达式.

少于8个字符的任何内容任何没有数字的内容任何没有大写字母的内容任何没有特殊字符的内容

所以:

^(.{0,7}|[^0-9]*|[^A-Z]*|[a-zA-Z0-9]*)$
Run Code Online (Sandbox Code Playgroud)

如果有任何匹配,那么它是一个无效的密码.

  • 如果OP恰好需要8个字符,那么您需要添加`|。{9,}`。+1概念 (3认同)
  • 正则表达式 *确实* 有 AND 运算符,它们称为先行/后行断言。 (3认同)

ste*_*ema 11

作为一个例子,如何使用可读/可维护的正则表达式完成此操作.

对于较长的正则表达式,您应始终使用表达式中的RegexOptions.IgnorePatternWhitespace空格和注释以提高可读性.

String[] passwords = { "foobar", "Foobar", "Foobar1", "Fooobar12" };

foreach (String s in passwords) {

    Match password = Regex.Match(s, @"
                                      ^              # Match the start of the string
                                       (?=.*\p{Lu})  # Positive lookahead assertion, is true when there is an uppercase letter
                                       (?=.*\P{L})   # Positive lookahead assertion, is true when there is a non-letter
                                       \S{8,}        # At least 8 non whitespace characters
                                      $              # Match the end of the string
                                     ", RegexOptions.IgnorePatternWhitespace);

    if (password.Success) {
        Console.WriteLine(s + ": valid");
    }
    else {
        Console.WriteLine(s + ": invalid");
    }
}

Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

  • 使用[Unicode类别](http://www.regular-expressions.info/unicode.html)是一个很好的主意.世界比ASCII更广泛! (2认同)

小智 9

答案是不使用正则表达式.这是设定和计数.

正则表达式与订单有关.

在你作为程序员的生活中,你会要求做很多没有意义的事情.学会深入挖掘.了解问题何时出错.

问题(如果提到正则表达式)是错误的.

伪代码(最近在太多语言之间切换):

if s.length < 8:
    return False
nUpper = nLower = nAlphanum = nSpecial = 0
for c in s:
    if isUpper(c):
        nUpper++
    if isLower(c):
        nLower++
    if isAlphanumeric(c):
        nAlphanum++
    if isSpecial(c):
        nSpecial++
return (0 < nUpper) and (0 < nAlphanum) and (0 < nSpecial)
Run Code Online (Sandbox Code Playgroud)

打赌你几乎立即阅读并理解上述代码.打赌你用正则表达式花了更长时间,并且不太确定它是否正确.扩展正则表达式是有风险的.延伸到上面,更不用说了.

另请注意,问题的措辞是不精确的.字符集是ASCII还是Unicode,还是?? 我从阅读问题的猜测是假设至少有一个小写字符.所以我认为假设的最后一条规则应该是:

return (0 < nUpper) and (0 < nLower) and (0 < nAlphanum) and (0 < nSpecial)
Run Code Online (Sandbox Code Playgroud)

(将帽子改为以安全为中心,这是一个非常烦人/无用的规则.)

学会知道问题何时是错误的,这比聪明的答案更重要.对错误问题的巧妙回答几乎总是错误的.

  • 我同意。与您一起工作的人越多,需要可读的代码就越多,尽管我看到的一些正则表达式实现非常清晰 (2认同)