密码必须是8个字符,包括1个大写字母,1个特殊字符,字母数字字符

我想要一个正则expression式来检查

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

这里是我的validationexpression式,它是八个字符,包括一个大写字母,一个小写字母,一个数字或特殊字符。

(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[AZ])(?=.*[az]).*$" 

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

对于那些不熟悉正则expression式的人来说,你所经历的正则expression式很可能是巨大的,是一个噩梦。

我认为,打破你的正则expression式,并一次一个这样做会更容易。 这可能需要多一点的工作,但我相当确定维护和debugging会更容易。 这也可以让你提供更直接的错误消息给你的用户(除了Invalid Password ),这应该改善用户体验。

从我所看到的你在正则expression式中非常stream利,所以我认为给你正则expression式做你所需要的将是徒劳的。

看到你的评论,这是我将如何去做:

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

  • 包括一个大写字母:您可以使用[AZ]+正则expression式。 如果string至less包含一个大写字母,则此正则expression式将产生true

  • 一个特殊字符:你可以使用\W来匹配任何不是字母或数字的字符,也可以使用类似[!@#]的字符来指定特殊字符的自定义列表。 请注意,像$^()这样的字符是正则expression式语言中的特殊字符,所以它们需要像下面这样转义: \$ 。 所以简而言之,你可以使用\W

  • 字母数字字符:使用\w+应该匹配任何字母,数字和下划线。

看看这个教程了解更多信息。

 ( # Start of group (?=.*\d) # must contain at least one digit (?=.*[AZ]) # must contain at least one uppercase character (?=.*\W) # must contain at least one special symbol . # match anything with previous condition checking {8,8} # length at least 8 characters and also maximum of 8 ) # End of group 

在一行中:

 ((?=.*\d)(?=.*[AZ])(?=.*\W).{8,8}) 

资料来源:

  • 密码匹配expression式

  • 正则expression式的密码强度validation

这么多的答案….都不好!

正则expression式没有AND运算符,所以要写一个匹配有效密码的正则expression式是非常困难的,当有效性由其他东西和其他东西来定义的时候…

但是,正则expression式有一个OR运算符,所以只需应用DeMorgan的定理,然后编写一个匹配无效密码的正则expression式。

小于8个字符的任何东西任何没有数字的东西任何没有大写字母的东西任何没有特殊字符的东西

所以:

 ^(.{0,7}|[^0-9]*|[^AZ]*|[a-zA-Z0-9]*)$ 

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

作为一个例子,这可以通过可读/可维护的正则expression式来完成。

对于更长的正则expression式,您应该始终使用RegexOptions.IgnorePatternWhitespace来允许expression式中的空格和注释以提高可读性。

 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(); 

答案是不使用正则expression式。 这是设置和计数。

正则expression式是有序的。

在作为程序员的生活中,你会被要求做很多没有意义的事情。 学习更深层次的挖掘。 了解问题出错的时候。

这个问题(如果提到正则expression式)是错误的。

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

 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) 

打赌你几乎立即阅读和理解上面的代码。 打赌你花了更多的时间与正则expression式,并不确定是正确的。 扩展正则expression式是有风险的。 扩展上面的直接,更不用说了。

还要注意这个问题是不精确的。 字符集是ASCII还是Unicode,或者? 我从阅读这个问题的猜测是,至less有一个小写字符是假定的。 所以我认为最后的规则应该是:

 return (0 < nUpper) and (0 < nLower) and (0 < nAlphanum) and (0 < nSpecial) 

(把帽子换成安全为重点,这是一个非常烦人的/不是有用的规则。)

学会了解这个问题的错误时,要比聪明的答案重要得多。 对错误问题的聪明回答几乎总是错误的。

如果你只需要一个大写和特殊字符,那么这应该工作:

 @"^(?=.{8,}$)(?=[^AZ]*[AZ][^AZ]*$)\w*\W\w*$" 

你正在寻找的正则expression式是: /^(?=.*[az])(?=.*[AZ])(?=.*[0-9])(?=.*[!@#\$%\^&\*\[\]"\';:_\-<>\., =\+\/\\]).{8,}$/u

示例和testing: http : //regexr.com/3fhr4

这个问题开始是病毒式的,出现了很多有趣的build议。

是的,手写是困难的。 所以更简单的解决scheme是使用模板。 尽pipe得到的正则expression式可能不是最优的,但是维护和/或更改会更容易,用户可以更好地控制结果。 我可能错过了一些东西,所以任何build设性的批评都会有帮助。

这个链接可能很有趣: 在string中按任何顺序匹配至less2个数字2个字母 , 正则expression式语言 , 捕获组

基于我在SO中看到的所有正则expression式,我正在使用这个模板(?=(?:.*?({type})){({count})}) 。 下一步是replace所需的模式( numberspecial character …)并添加configuration的长度。

我已经做了一个类组成的正则expression式PasswordRegexGenerator.cs一个例子:

 string result = new PasswordRegexGenerator ( ) .UpperCase ( 3, -1 ) // ... {3,} .Number ( 2, 4 ) // ... {2,4} .SpecialCharacter ( 2 ) // ... {2} .Total ( 8,-1 ) .Compose ( ); /// <summary> /// Generator for regular expression, validating password requirements. /// </summary> public class PasswordRegexGenerator { private string _elementTemplate = "(?=(?:.*?({type})){({count})})"; private Dictionary<string, string> _elements = new Dictionary<string, string> { { "uppercase", "[AZ]" }, { "lowercase", "[az]" }, { "number", @"\d" }, { "special", @"\W" }, { "alphanumeric", @"\w" } }; private StringBuilder _sb = new StringBuilder ( ); private string Construct ( string what, int min, int max ) { StringBuilder sb = new StringBuilder ( _elementTemplate ); string count = min.ToString ( ); if ( max == -1 ) { count += ","; } else if ( max > 0 ) { count += "," + max.ToString(); } return sb .Replace ( "({type})", what ) .Replace ( "({count})", count ) .ToString ( ); } /// <summary> /// Change the template for the generation of the regex parts /// </summary> /// <param name="newTemplate">the new template</param> /// <returns></returns> public PasswordRegexGenerator ChangeRegexTemplate ( string newTemplate ) { _elementTemplate = newTemplate; return this; } /// <summary> /// Change or update the regex for a certain type ( number, uppercase ... ) /// </summary> /// <param name="name">type of the regex</param> /// <param name="regex">new value for the regex</param> /// <returns></returns> public PasswordRegexGenerator ChangeRegexElements ( string name, string regex ) { if ( _elements.ContainsKey ( name ) ) { _elements[ name ] = regex; } else { _elements.Add ( name, regex ); } return this; } #region construction methods /// <summary> /// Adding number requirement /// </summary> /// <param name="min"></param> /// <param name="max"></param> /// <returns></returns> public PasswordRegexGenerator Number ( int min = 1, int max = 0 ) { _sb.Append ( Construct ( _elements[ "number" ], min, max ) ); return this; } public PasswordRegexGenerator UpperCase ( int min = 1, int max = 0 ) { _sb.Append ( Construct ( _elements[ "uppercase" ], min, max ) ); return this; } public PasswordRegexGenerator LowerCase ( int min = 1, int max = 0 ) { _sb.Append ( Construct ( _elements[ "lowercase" ], min, max ) ); return this; } public PasswordRegexGenerator SpecialCharacter ( int min = 1, int max = 0 ) { _sb.Append ( Construct ( _elements[ "special" ], min, max ) ); return this; } public PasswordRegexGenerator Total ( int min, int max = 0 ) { string count = min.ToString ( ) + ( ( max == 0 ) ? "" : "," + max.ToString ( ) ); _sb.Append ( ".{" + count + "}" ); return this; } #endregion public string Compose () { return "(" + _sb.ToString ( ) + ")"; } } 

您可以使用下面的类进行validation:

 public class PasswordValidator{ private Pattern pattern; private Matcher matcher; private static final String PASSWORD_PATTERN = "((?=.*\\d)(?=.*[az])(?=.*[AZ])(?=.*[@#$%]).{6,20})"; public PasswordValidator(){ pattern = Pattern.compile(PASSWORD_PATTERN); } /** * Validate password with regular expression * @param password password for validation * @return true valid password, false invalid password */ public boolean validate(final String password){ matcher = pattern.matcher(password); return matcher.matches(); } } 

其中6和20是密码的最小和最大长度。

 /^(?=.*\d)(?=.*[az])(?=.*[AZ]).{8,}$/