我想要一个正则表达式来检查
密码必须是八个字符,包括一个大写字母,一个特殊字符和字母数字字符。
这是我的验证表达式,它包含八个字符,包括一个大写字母,一个小写字母和一个数字或特殊字符。
(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"
如何为必须包含八个大写字母(一个大写字母,一个特殊字符和字母数字字符)的密码编写密码?
我想要一个正则表达式来检查
密码必须是八个字符,包括一个大写字母,一个特殊字符和字母数字字符。
这是我的验证表达式,它包含八个字符,包括一个大写字母,一个小写字母和一个数字或特殊字符。
(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"
如何为必须包含八个大写字母(一个大写字母,一个特殊字符和字母数字字符)的密码编写密码?
Answers:
您所追求的正则表达式很可能非常庞大且难以维持,尤其是对于不那么熟悉正则表达式的人。
我认为分解您的正则表达式并一次执行一次会更容易。可能还需要做更多的工作,但是我敢肯定,维护和调试它会更容易。这还将使您能够向用户(不仅仅是Invalid Password
)提供更多定向错误消息,这将改善用户体验。
从我所看到的来看,您在regex方面相当流利,因此我认为为您提供正则表达式来做您需要的事情是徒劳的。
看到您的评论,这就是我的处理方式:
必须为八个字符长:为此,您不需要正则表达式。使用该.Length
属性应该足够了。
包括一个大写字母:您可以使用[A-Z]+
正则表达式。如果字符串包含至少一个大写字母,则此正则表达式将产生true
。
一个特殊字符:可以使用\W
匹配任何非字母或数字的字符,也可以使用诸如此类的东西[!@#]
指定特殊字符的自定义列表。不过,请注意字符如$
,^
,(
和)
是在正则表达式语言的特殊字符,所以需要进行转义像这样:\$
。简而言之,您可以使用\W
。
字母数字字符:使用\w+
时应匹配任何字母,数字和下划线。
查看本教程以获取更多信息。
( # 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
一行:
((?=.*\d)(?=.*[A-Z])(?=.*\W).{8,8})
您需要匹配整个输入字符串。因此,您可以将regex放在^
和之间,$
以防止意外地将部分匹配假定为匹配整个输入:
^((?=.*\d)(?=.*[A-Z])(?=.*\W).{8,8})$
^
和之间加上正则表达式$
。试试这个:^((?=.*\d)(?=.*[A-Z])(?=.*\W).{8,8})$
这么多答案...。都不好!
正则表达式没有AND运算符,因此,当有效性是由AND和其他事物以及其他事物定义的时,很难编写与有效密码匹配的正则表达式。
但是,正则表达式确实具有OR运算符,因此只需应用DeMorgan定理,并编写与无效密码匹配的正则表达式即可。
少于8个字符什么或什么没有编号或没有大写什么或不带特殊字符什么
所以:
^(.{0,7}|[^0-9]*|[^A-Z]*|[a-zA-Z0-9]*)$
如果符合条件,则为无效密码。
|.{9,}
。+1的概念
答案是不使用正则表达式。这是设置和计数。
正则表达式与顺序有关。
在作为程序员的生活中,您会被要求做很多没有意义的事情。学习更深入地学习。了解问题出在什么时候。
这个问题(如果提到正则表达式)是错误的。
伪代码(最近在太多语言之间切换):
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)
打赌,您几乎立即阅读并理解了上面的代码。押注您用正则表达式花了更长的时间,而不确定它是正确的。扩展正则表达式是有风险的。扩展上面的立即数,更不用说扩展了。
还要注意,这个问题的措词不准确。字符集是ASCII还是Unicode还是?? 通过阅读问题,我的猜测是假定至少有一个小写字符。因此,我认为假定的最后一条规则应该是:
return (0 < nUpper) and (0 < nLower) and (0 < nAlphanum) and (0 < nSpecial)
(将帽子更改为以安全为中心,这是一个非常烦人/没有用的规则。)
学会知道何时问题是错的,比聪明的答案重要得多。对错误问题的明智答案几乎总是错误的。
例如,如何使用可读/可维护的正则表达式来完成此操作。
对于更长的正则表达式,应始终使用表达式中的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();
lookahead assertion
“和”模式来覆盖单个正则表达式中整个约束的最佳方法。适用于更多约束,如果某些约束应通过配置启用/禁用,则可以轻松生成。
如果只需要一个大写字母和特殊字符,则应该可以使用:
@"^(?=.{8,}$)(?=[^A-Z]*[A-Z][^A-Z]*$)\w*\W\w*$"
AAaaaaaaa#
根据此表达式,字符串不正确
您要查找的正则表达式为:/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*\[\]"\';:_\-<>\., =\+\/\\]).{8,}$/u
。
示例和测试:http : //regexr.com/3fhr4
.
之前的{8,}
对[^\s]
。
这个问题开始流行起来,并且出现了许多有趣的建议。
是的,用手写很难。因此,更简单的解决方案是使用模板。尽管生成的正则表达式可能不是最佳的,但它更易于维护和/或更改,并且用户可以更好地控制结果。我可能错过了一些东西,因此任何建设性的批评都会有所帮助。
该链接可能很有趣:字符串中以任意顺序匹配至少2位2个字母,正则表达式语言,捕获组
我正在(?=(?:.*?({type})){({count})})
基于在SO中看到的所有正则表达式使用此模板。下一步是替换所需的模式(number
,special character
...),并添加长度配置。
我制作了一个用于编写正则表达式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", "[A-Z]" },
{ "lowercase", "[a-z]" },
{ "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 ( ) + ")";
}
}
您可以使用下面的类进行验证:
public class PasswordValidator{
private Pattern pattern;
private Matcher matcher;
private static final String PASSWORD_PATTERN =
"((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{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是密码的最小和最大长度。
(?>{8,})
(?<=...)
(?<=\p{Lu}.*)
(?<=\W.*)
(?<=\w.*)
总结:
(?>.{8,})(?<=\p{Lu}.*)(?<=\W.*)(?<=\w.*)