2010-07-30 8 views

Répondre

12

Essayez ceci:

bool result = 
    passwordText.Any(c => char.IsLetter(c)) && 
    passwordText.Any(c => char.IsDigit(c)) && 
    passwordText.Any(c => char.IsSymbol(c)); 

Bien que vous souhaitiez être un peu plus précis sur ce que vous entendez par "caractère alphabétique", "nombre" et "symbole", car ces termes signifient des choses différentes pour différentes personnes et il n'est pas certain que la définition de ces termes corresponde aux définitions le cadre utilise.

Je suppose que par lettre vous voulez dire 'a-z' ou 'A-Z', par chiffre, vous voulez dire '0-9' et par symbole, vous voulez dire tout autre caractère ASCII imprimable. Si oui, essayez ceci:

static bool IsLetter(char c) 
{ 
    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); 
} 

static bool IsDigit(char c) 
{ 
    return c >= '0' && c <= '9'; 
} 

static bool IsSymbol(char c) 
{ 
    return c > 32 && c < 127 && !IsDigit(c) && !IsLetter(c); 
} 

static bool IsValidPassword(string password) 
{ 
    return 
     password.Any(c => IsLetter(c)) && 
     password.Any(c => IsDigit(c)) && 
     password.Any(c => IsSymbol(c)); 
} 

Si en fait vous dire quelque chose d'autre ajuster ensuite les méthodes ci-dessus en conséquence.

1

Vous pouvez utiliser String.IndexOfAny() pour déterminer si au moins une fois un caractère d'un tableau de caractères spécifié existe dans la chaîne.

+0

comme ça? if ((PasswordText.IndexOfAny (alpha.ToCharArray())> = 0) && (PasswordText.IndexOfAny (chiffres.ToCharArray())> = 0)) { } – 001

+0

Qu'en est-il des caractères spéciaux? – 001

+0

@khou - c'est l'idée. Vous auriez besoin de créer un 'char []' des caractères spéciaux que vous voulez prendre en charge. –

1
strPassword.IndexOfAny(new char['!','@','#','$','%','^','&','*','(',')']); 

Vous pouvez exécuter cela avec un tableau de caractères/symboles que vous recherchez. Si elle renvoie quelque chose de plus grand que -1, vous avez une correspondance. La même chose peut être faite avec des nombres. Cela vous permettra de définir exactement ce que vous cherchez, et vous permettra facilement d'exclure certains caractères si vous le souhaitez. L'utilisation de RegEx va être plus flexible.

2

Vous pouvez toujours le stocker dans un fichier de ressources et le modifier sans apporter de modifications au code.

Voir ci-dessous pour quelques exemples de mots de passe;

http://regexlib.com/Search.aspx?k=password

0

Cela devrait répondre à tous vos besoins. Il n'utilise pas regex.

private bool TestPassword(string passwordText, int minimumLength=5, int maximumLength=12,int minimumNumbers=1, int minimumSpecialCharacters=1) { 
    //Assumes that special characters are anything except upper and lower case letters and digits 
    //Assumes that ASCII is being used (not suitable for many languages) 

    int letters = 0; 
    int digits = 0; 
    int specialCharacters = 0; 

    //Make sure there are enough total characters 
    if (passwordText.Length < minimumLength) 
    { 
     ShowError("You must have at least " + minimumLength + " characters in your password."); 
     return false; 
    } 
    //Make sure there are enough total characters 
    if (passwordText.Length > maximumLength) 
    { 
     ShowError("You must have no more than " + maximumLength + " characters in your password."); 
     return false; 
    } 

    foreach (var ch in passwordText) 
    { 
     if (char.IsLetter(ch)) letters++; //increment letters 
     if (char.IsDigit(ch)) digits++; //increment digits 

     //Test for only letters and numbers... 
     if (!((ch > 47 && ch < 58) || (ch > 64 && ch < 91) || (ch > 96 && ch < 123))) 
     { 
      specialCharacters++; 
     } 
    } 

    //Make sure there are enough digits 
    if (digits < minimumNumbers) 
    { 
     ShowError("You must have at least " + minimumNumbers + " numbers in your password."); 
     return false; 
    } 
    //Make sure there are enough special characters -- !(a-zA-Z0-9) 
    if (specialCharacters < minimumSpecialCharacters) 
    { 
     ShowError("You must have at least " + minimumSpecialCharacters + " special characters (like @,$,%,#) in your password."); 
     return false; 
    } 

    return true;   
} 

private void ShowError(string errorMessage) { 
    Console.WriteLine(errorMessage); 
} 

Voici un exemple de la façon de l'appeler:

private void txtPassword_TextChanged(object sender, EventArgs e) 
{ 
    bool temp = TestPassword(txtPassword.Text, 6, 10, 2, 1); 
} 

Cela ne teste pas pour un mélange de lettres majuscules et minuscules, qui peuvent être préférés. Pour ce faire, il suffit de casser la condition char où (ch > 96 && ch < 123) est l'ensemble des lettres minuscules et (ch > 64 && ch < 91) sont majuscules.

Regex est plus court et plus simple (pour ceux qui sont bons avec) et il existe de nombreux exemples en ligne, mais cette méthode est meilleure pour personnaliser les commentaires pour l'utilisateur.

1

C'est assez simple;

Regex sampleRegex = new Regex(@"(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{2,})$"); 
boolean isStrongPassword= sampleRegex.IsMatch(givenPassword); 
Questions connexes