Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure AD云用户帐户密码策略的基于Java的正则表达式_Java_Regex_Azure_Azure Active Directory - Fatal编程技术网

Azure AD云用户帐户密码策略的基于Java的正则表达式

Azure AD云用户帐户密码策略的基于Java的正则表达式,java,regex,azure,azure-active-directory,Java,Regex,Azure,Azure Active Directory,我正在尝试使用正则表达式在Java中实现 我已经定义了一个模式字符串,我使用如下: // 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 charact

我正在尝试使用正则表达式在Java中实现

我已经定义了一个模式字符串,我使用如下:

// 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"));
}

我已经看到了关于正则表达式问题的非常优雅的答案,但通常它们不涉及字符类组合。希望有人能告诉我我做错了什么,或者是否有更好的方法来做这件事。

您需要在最后一部分指定您允许的字符,而不是点。将
{8,16}
替换为
[-A-Za-z0-9@$%^&*.+=\[\]{}}:

^(?:
 (?=.*[a-z])(?=.*[A-Z])(?=.*\d)
 |
 (?=.*[a-z])(?=.*[A-Z])(?=.*[-@#$%^&*_!+=\[\]{}|:',.?/`~"();])
 |
 (?=.*[a-z])(?=.*\d)(?=.*[-@#$%^&*_!+=\[\]{}|:',.?/`~"();])
 |
 (?=.*[A-Z])(?=.*\d)(?=.*[-@#$%^&*_!+=\[\]{}|:',.?/`~"();])
)
[-A-Za-z0-9@#$%^&*_!+=\[\]{}|:',.?/`~"();]{8,16}
$


Abcdef 12
((?=.[a-z])(?=.[a-z])(?=.[0-9]))匹配。{8,16}
part,因此它是false,因为
validate
返回true。我现在看到了问题,我的正则表达式没有排除组件,防止不允许的字符类。它使用包含模式。是否有更好的/优雅的方法来实现该要求?我会在我的孩子睡觉后检查它,如果我没有睡着的话lier:)大约一个小时或一个半小时。是否值得尝试先使用排他检查,然后再使用包含检查?换句话说,也许可以检查字符串是否包含不在集合
a-zA-Z0-9@$%^&*-[]{}中的字符:“,.?/”()
并抢占实际的、包含性的检查,以检查是否存在所需的字符组合。啊哈,因此这些字符不仅是必需的,而且是允许的。只需将它们全部放入一个字符类,而不是
。请参见。将
{8,16}
替换为
[-a-Za-z0-9@$%^&*.+=\[\\\\]{124}:',.?/``>“;][8,16}
感谢@Wiktor……除了提供一个实时的regex演示示例外,还为更新Java方法付出了更多的努力!
private static final String PATTERN_PASSWORD_REGEX = new StringBuilder('^(?:')
    .append("(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])")
    .append('|') // -or-
    .append("(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=.*[-@#$%^&*_!+=\\[\\]{}|:‘,.?/`~“();])")
    .append('|') // -or-
    .append("(?=[^a-z]*[a-z])(?=[^0-9]*[0-9])(?=.*[-@#$%^&*_!+=\\[\\]{}|:‘,.?/`~“();])")
    .append('|') // -or-
    .append("(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])(?=.*[-@#$%^&*_!+=\\[\\]{}|:‘,.?/`~“();])")
    .append(')[-A-Za-z0-9@#$%^&*_!+=\\[\\]{}|:‘,.?/`~“();]{8,16}$')
    .toString();