^(?=.*[A-Z])(?=.*\d)(?!.*(.)\1\1)[a-zA-Z0-9@]{6,12}$
[a-zA-Z0-9@]{6,12}
(?=.*\d)
(?=.*[A-Z])
(?!.*(.)\1\1)
следит за тем, чтобы ни один символ не появлялся более двух раз подряд. Подстрока aa
подходит, aaa
- нет. (?!.*(.+)\1\1)
, чтобы отбрасывать повторяющиеся подстроки длиной более одной (например, ababab
) или добавьте .*
перед \1
, чтобы отбрасывать и не повторяющиеся. Не похоже на задачу, особенно подходящую для Regex, поскольку вы хотите проверить несколько условий одновременно. (Вы можете использовать несколько регексов, но тогда обычный C# с LINQ - более приятный способ тестирования). Попробуйте следующую функцию:
public static bool IsStrongPassword(string password)
{
// Minimum and Maximum Length of field - 6 to 12 Characters
if (password.Length < 6 || password.Length > 12)
return false;
// Special Characters - Not Allowed
// Spaces - Not Allowed
if (!(password.All(c => char.IsLetter(c) || char.IsDigit(c))))
return false;
// Numeric Character - At least one character
if (!password.Any(c => char.IsDigit(c)))
return false;
// At least one Capital Letter
if (!password.Any(c => char.IsUpper(c)))
return false;
// Repetitive Characters - Allowed only two repetitive characters
var repeatCount = 0;
var lastChar = '\0';
foreach(var c in password)
{
if (c == lastChar)
repeatCount++;
else
repeatCount = 0;
if (repeatCount == 2)
return false;
lastChar = c;
}
return true;
}
Убедитесь, что вы импортировали System.Linq
, и вы готовы к работе.