Reputation: 65205
How do you check if a string passwordText contains at least
Upvotes: 5
Views: 38732
Reputation: 240
For something quite simple, I took this from a program I used previously.
//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
}
Upvotes: 2
Reputation: 6514
This is pretty simple ;
Regex sampleRegex = new Regex(@"(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{2,})$");
boolean isStrongPassword= sampleRegex.IsMatch(givenPassword);
Upvotes: 1
Reputation: 3731
This should meet all of your requirements. It does not use 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);
}
This is an example of how to call it:
private void txtPassword_TextChanged(object sender, EventArgs e)
{
bool temp = TestPassword(txtPassword.Text, 6, 10, 2, 1);
}
This does not test for a mixture of upper and lower case letters, which may be preferred. To do so, simply break the char condition up where (ch > 96 && ch < 123)
is the set of lower case letters and (ch > 64 && ch < 91)
are upper case.
Regex is shorter and simpler (for those who are good with it) and there are many examples online, but this method is better for customizing feedback for the user.
Upvotes: 0
Reputation: 839034
Try this:
bool result =
passwordText.Any(c => char.IsLetter(c)) &&
passwordText.Any(c => char.IsDigit(c)) &&
passwordText.Any(c => char.IsSymbol(c));
Though you might want to be a little more specific about what you mean by 'alphabet character', 'number' and 'symbol' because these terms mean different things to different people and it's not certain that your definition of these terms matches the definitions the framework uses.
I would guess that by letter you mean 'a-z' or 'A-Z', by digit you mean '0-9' and by symbol you mean any other printable ASCII character. If so, try this:
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));
}
If in fact you mean something else then adjust the above methods accordingly.
Upvotes: 19
Reputation: 4562
strPassword.IndexOfAny(new char['!','@','#','$','%','^','&','*','(',')']);
You can run that with an array of the characters/symbols you're looking for. If it returns anything larger than -1, you've got a match. The same can be done with numbers.
This will allow you to define exactly what you're looking for, and will easily allow you to exclude certain characters if you wish.
Upvotes: 0
Reputation: 4401
Using RegEx is going to be most flexible. You can always store it in a resource file and change it without making code changes.
See the below for some password examples;
http://regexlib.com/Search.aspx?k=password
Upvotes: 2
Reputation:
You can use String.IndexOfAny()
to determine if at least once character in a specified character array exists in the string.
Upvotes: 1