Регулярные выражения не особенно хороши для того, чтобы определенные группы символов появлялись определенное количество раз. Хотя это, вероятно, возможно - это, без сомнения, будет запутанным и неочевидным.
Если вы программируете на .NET (C # или VB), вы можете использовать простую функцию проверки, например:
bool ValidatePasswordCompliance( string password )
{
int countDigits = 0;
int countAlpha = 0;
int countOthers = 0;
foreach( char c in password )
{
countDigit += c.IsDigit ? 1 : 0;
countAlpha += c.IsAlpha ? 1 : 0;
countOther += !(c.IsAlpha || c.IsDigit) ? 1 : 0;
}
return countDigits >= 3 && (countDigits + countAlpha + countOthers) >= 7;
}
Если вы работаете с .NET 3.5 или выше, вы можете использовать LINQ, чтобы упростить это:
bool ValidatePasswordCompliance( string password )
{
return password.Count() >= 7 &&
password.Count( x => x.IsDigit ) >= 3;
}