我正在编写代码来确定密码是否包含足够的标点字符。
如何计算集合中任何字符的出现次数?
这些方面的东西:
private const string nonAlphaNumericCharSet = "#*!?£$+-^<>[]~()&";
...
public static bool PasswordMeetsStrengthRequirements(string password)
{
return password.Length >= MINIMUM_PASSWORD_LENGTH && password.NumberOfOccurences(nonAlphaNumericCharSet.ToCharArray()) >= MINIMUM_NONALPHANUMERIC_CHARS;
}
优雅的linq解决方案的奖励积分。
答案 0 :(得分:17)
如何计算集合中任何字符的出现次数?
var count = password.Count(nonAlphaNumericCharSet.Contains);
答案 1 :(得分:1)
你可以算这个
int count = "he!l!l!o".Split('!').Length - 1;
它将返回3.
使用linq
int count="he!l!l!o".Count(x => x == '!');
答案 2 :(得分:1)
以下是一个例子:
private const string nonAlphaNumericCharSet = "#*!?£$+-^<>[]~()&";
public static bool PasswordMeetsStrengthRequirements(string password)
{
return password.Count(x => nonAlphaNumericCharSet.Contains(x)) > 2 && password.Length > 1;
}
public static void Main()
{
PasswordMeetsStrengthRequirements("Test").Dump();
PasswordMeetsStrengthRequirements("Test#").Dump();
PasswordMeetsStrengthRequirements("(Test#").Dump();
PasswordMeetsStrengthRequirements("(Te[st#").Dump();
}
答案 3 :(得分:1)
Regex rgx = new Regex(@"^(?=.*(\W.*){4,}).{8,}$", RegexOptions.Compiled);
bool validPassword = rgx.IsMatch(password);
4 = min not word / digit char
8 =最小密码
Linq可能被认为是优雅的(它不是恕我直言),但性能成本是多少?
------------评论后更新---------------
如果您想匹配字符子集,则必须将\W
替换为[]
[]
=字符范围
某些字符必须使用\
在你的情况下:[#\*!\?£\$\+-\^\<\>\[\]~\(\)&]