Я пытаюсь реализовать политику учетных записей пользователей облачного Azure AD в Java с использованием регулярных выражений.
Я определил строку шаблона и использую string.matches (pattern) следующим образом:
// ONE OF THESE CHARACTER CLASS COMBINATIONS NEED TO BE MET
// combination of lowercase, uppercase and numbers, 8 to 16 characters in length
// combination of lowercase, uppercase and symbols, 8 to 16 characters in length
// combination of lowercase, numbers and symbols, 8 to 16 characters in length
// combination of uppercase, numbers and symbols 8 to 16 characters in length
private static final String PATTERN_PASSWORD_REGEX = new StringBuilder('^')
.append("((?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])).{8,16}")
.append('|') // -or-
.append("((?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&*\\-_!+=\\[\\]{}|\\:‘,.?\\/`~“\\(\\);])).{8,16}")
.append('|') // -or-
.append("((?=.*[a-z])(?=.*[0-9])(?=.*[@#$%^&*\\-_!+=\\[\\]{}|\\:‘,.?\\/`~“\\(\\);])).{8,16}")
.append('|') // -or-
.append("((?=.*[A-Z])(?=.*[0-9])(?=.*[@#$%^&*\\-_!+=\\[\\]{}|\\:‘,.?\\/`~“\\(\\);])).{8,16}")
.append('$')
.toString();
public static boolean validate(String password) {
return password.matches(PATTERN_PASSWORD_REGEX);
}
Каким-то образом он обрабатывает пробелы как специальный символ, хотя я включил его в регулярное выражение , а не . Приведенный ниже метод тестирования JUnit передает все утверждения, кроме последнего.
@Test
public void testPassword() {
Assert.assertTrue("password is valid", validate("Abcdef12"));
Assert.assertTrue("password is valid", validate("abcde$12"));
Assert.assertTrue("password is valid", validate("ABCDE%12"));
Assert.assertTrue("password is valid", validate("Abcde~12"));
Assert.assertFalse("password is invalid", validate("abcdefgh"));
Assert.assertFalse("password is invalid", validate("12345678"));
Assert.assertFalse("password is invalid", validate("ABCDEFGH"));
Assert.assertFalse("password is invalid", validate("ABCDefgh"));
Assert.assertFalse("password is invalid", validate("!~$:-_@&"));
// This assertion fails...
Assert.assertFalse("password is invalid", validate("Abcdef 12"));
}
Я видел очень элегантные ответы на вопросы регулярных выражений о SO, но обычно они не включают комбинации классов символов. Надеюсь, кто-нибудь скажет мне, что я делаю неправильно, или если есть намного лучший способ сделать это.