La contraseña de verificación contiene caracteres alfanuméricos y especiales

¿Cómo verifica si una cadena passwordText contiene al menos

  • 1 personaje del alfabeto
  • 1 numero
  • 1 personaje especial (un símbolo)

Prueba esto:

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

Aunque es posible que desee ser un poco más específico acerca de lo que quiere decir con “carácter del alfabeto”, “número” y “símbolo” porque estos términos significan cosas diferentes para diferentes personas y no es seguro que su definición de estos términos coincida con las definiciones de usos del marco.

Supongo que por letra te refieres a ‘az’ o ‘A-Z’, por dígito te refieres a ‘0-9’ y por símbolo a cualquier otro carácter ASCII imprimible. Si es así, intente esto:

 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 de hecho quiere decir algo más, ajuste los métodos anteriores según corresponda.

Usar RegEx será más flexible. Siempre puede almacenarlo en un archivo de recursos y cambiarlo sin hacer cambios en el código.

Vea a continuación algunos ejemplos de contraseñas;

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

Puede usar String.IndexOfAny() para determinar si al menos una vez el carácter en una matriz de caracteres especificada existe en la cadena.

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

Puede ejecutarlo con una matriz de los caracteres / símbolos que está buscando. Si devuelve algo más grande que -1, tienes una coincidencia. Lo mismo se puede hacer con los números.

Esto le permitirá definir exactamente lo que está buscando y le permitirá excluir ciertos caracteres si lo desea.

Esto es bastante simple;

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

Para algo bastante simple, tomé esto de un progtwig que usé anteriormente.

  //password rules int minUpper = 3; int minLower = 3; int minLength = 8; int maxLength = 12; string allowedSpecials = "@#/.!')"; //entered password string enteredPassword = "TEStpass123@"; //get individual characters char[] characters = enteredPassword.ToCharArray(); //checking variables int upper = 0; int lower = 0; int character = 0; int number = 0; int length = enteredPassword.Length; int illegalCharacters = 0; //check the entered password foreach (char enteredCharacters in characters) { if (char.IsUpper(enteredCharacters)) { upper = upper + 1; } else if (char.IsLower(enteredCharacters)) { lower = lower + 1; } else if (char.IsNumber(enteredCharacters)) { number = number + 1; } else if (allowedSpecials.Contains(enteredCharacters.ToString())) { character = character + 1; } else { illegalCharacters = illegalCharacters + 1; } // MessageBox.Show(chars.ToString()); } if (upper < minUpper || lower < minLower || length < minLength || length > maxLength || illegalCharacters >=1) { MessageBox.Show("Something's not right, your password does not meet the minimum security criteria"); } else { //code to proceed this step } 

Esto debe cumplir con todos sus requisitos. No utiliza expresiones regulares.

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

Este es un ejemplo de cómo llamarlo:

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

Esto no prueba una mezcla de letras mayúsculas y minúsculas, lo que puede ser preferible. Para hacerlo, simplemente rompa la condición de caracterización donde (ch > 96 && ch < 123) es el conjunto de letras minúsculas y (ch > 64 && ch < 91) son mayúsculas.

Regex es más corto y más simple (para aquellos que son buenos con él) y hay muchos ejemplos en línea, pero este método es mejor para personalizar la retroalimentación para el usuario.