计算字符串中数组出现的字符数?

时间:2013-05-22 09:48:09

标签: c# algorithm

我正在编写代码来确定密码是否包含足够的标点字符。

如何计算集合中任何字符的出现次数?

这些方面的东西:

private const string nonAlphaNumericCharSet = "#*!?£$+-^<>[]~()&";
...
public static bool PasswordMeetsStrengthRequirements(string password)
{
    return password.Length >= MINIMUM_PASSWORD_LENGTH && password.NumberOfOccurences(nonAlphaNumericCharSet.ToCharArray()) >= MINIMUM_NONALPHANUMERIC_CHARS;
}

优雅的linq解决方案的奖励积分。

4 个答案:

答案 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)

RegExp

怎么样?
Regex rgx = new Regex(@"^(?=.*(\W.*){4,}).{8,}$", RegexOptions.Compiled);
bool validPassword = rgx.IsMatch(password);

4 = min not word / digit char

8 =最小密码

Linq可能被认为是优雅的(它不是恕我直言),但性能成本是多少?

------------评论后更新---------------

如果您想匹配字符子集,则必须将\W替换为[]

[] =字符范围

某些字符必须使用\

进行转义

在你的情况下:[#\*!\?£\$\+-\^\<\>\[\]~\(\)&]

你可以找到regular expression cheat sheet