2013-05-22 22 views
7

Ich schreibe Code, um festzustellen, ob ein Passwort genügend Interpunktionszeichen enthält.Anzahl der Vorkommen von Zeichen aus Array in String zählen?

Wie zähle ich die Anzahl der Vorkommen von Zeichen aus einem Satz?

Etwas in dieser Richtung:

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

Bonuspunkte für eine elegante Linq Lösung.

+3

Wie verlosen Sie Bonuspunkte? – Oliver

+0

@Oliver: Ich schätze, Black Knight wird ein Kopfgeld geben (nach der 24-Stunden-Wartezeit). –

+0

Ich dachte über die Vergabe von Upvotes nach. Und natürlich meine persönliche Dankbarkeit;). Wenn jedoch Leute denken, dass eine Antwort eine Prämie verdient, werde ich eine vergeben. – Kev

Antwort

17

Wie kann ich die Anzahl der Vorkommen von beliebigen Zeichen aus einem Satz zählen ?

var count = password.Count(nonAlphaNumericCharSet.Contains); 
+2

+ 1, slick ............, für diejenigen wie mich wäre seine einfachere Form: 'var temp = password.Count (r => nonAlphaNumericCharSet.Contains (r));' – Habib

+0

Danke für die Erläuterung. Ich habe mich nur gefragt, was die einfachere Form wäre. – Kev

+1

Nun, schlägt meine Lösung. – Carra

1

Sie können wie diese zählen

int count = "he!l!l!o".Split('!').Length - 1; 

es 3. zurück

Mit Linq

int count="he!l!l!o".Count(x => x == '!'); 
1

Hier ist ein Beispiel:

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

was ein RegExp

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

4 = min nicht Wort/Ziffer char

8 = min Passwort leght

Linq kann als elegant betrachtet werden (es ist nicht IMHO), aber bei welcher Leistung kosten?

------------ Update nach Kommentar ---------------

wenn Sie eine Teilmenge von Zeichen übereinstimmen Sie müssen ersetzen \W mit []

[] = Bereich von Zeichen

einige Zeichen mit \

in Ihrem Fall zu entkommen: [#\*!\?£\$\+-\^\<\>\[\]~\(\)&]

Dort finden Sie eine regular expression cheat sheet

+0

Danke. Regex sind mächtig, aber ich bin nicht sehr gut darin. In diesem Fall ist es jedoch wichtig, nur die Interpunktion einer vordefinierten Menge zu berücksichtigen, nicht nur alle Interpunktionszeichen. Wie würde ich das mit einer Regex machen? – Kev

+0

@BlackKnight hat gerade meine Antwort aktualisiert. Ich bin auch nicht gut im regulären Ausdruck. Ich finde dieses Cheatsheet sehr nützlich: https://github.com/shadowbq/Cheat-Sheets/blob/master/regex/regular-expressions-cheat-sheet-v2.pdf Ich habe es gedruckt und es ist immer in der Nähe von meinem Schreibtisch! – giammin

Verwandte Themen