這是我的嘗試。請注意,這使用unicode類別進行驗證,因此非拉丁語言友好。
import java.util.regex.Pattern;
public class PasswordValidator {
public static void main(String[] args) {
final PasswordValidator passwordValidator = new PasswordValidator();
for (String password : new String[] { "abc", "abc123", "ABC123", "abc123ABC", "!!!AAabas1", "гшщз",
"гшщзЧСМИ22" }) {
System.out.printf("Password '%s' is %s%n", password, passwordValidator.isValidPassword(password) ? "ok"
: "INVALID");
}
}
private static final Pattern LOWER_CASE = Pattern.compile("\\p{Lu}");
private static final Pattern UPPER_CASE = Pattern.compile("\\p{Ll}");
private static final Pattern DECIMAL_DIGIT = Pattern.compile("\\p{Nd}");
/**
* Determine if a password is valid.
*
* <p>
* A password is considered valid if it contains:
* <ul>
* <li>At least one lower-case letter</li>
* <li>At least one upper-case letter</li>
* <li>At least one digit</li>
* </p>
*
* @param password
* password to validate
* @return True if the password is considered valid, otherwise false
*/
public boolean isValidPassword(final String password) {
return containsDigit(password) && containsLowerCase(password) && containsUpperCase(password);
}
private boolean containsDigit(final String str) {
return DECIMAL_DIGIT.matcher(str).find();
}
private boolean containsUpperCase(final String str) {
return UPPER_CASE.matcher(str).find();
}
private boolean containsLowerCase(final String str) {
return LOWER_CASE.matcher(str).find();
}
}
下面是輸出:
Password 'abc' is INVALID
Password 'abc123' is INVALID
Password 'ABC123' is INVALID
Password 'abc123ABC' is ok
Password '!!!AAabas1' is ok
Password 'гшщз' is INVALID
Password 'гшщзЧСМИ22' is ok
給國際用戶的一些愛 - 爲了勝利UTF8!此外,使用標點符號和其他特殊字符的人也應該獲得額外的功勞。 –
@Seth Robertson:我認爲Java的內部表示是UTF-16 ... – phooji
@phooji:是的,但他只是給0-9A-Za-z的功勞,不包括空格/: - @ [-' { - 然後是完整的UTF-8字符集。 –