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.
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 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.
This is pretty simple ;
For something quite simple, I took this from a program I used previously.
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
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.
You can use
String.IndexOfAny()
to determine if at least once character in a specified character array exists in the string.This should meet all of your requirements. It does not use regex.
This is an example of how to call it:
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.