2

我正在尝试创建一个正则表达式来匹配新密码(有效),但我只需要最后一步即可使其 100% 工作。

这是 RegExp 及其用途:

((?=.*(\\d|[\\(\\)\\{\\}\\?!\\$&\\*%\\=\\+_\\-\\.]))(?=.*[a-z])(?=.*[A-Z]).{8,})

正则表达式说:必须使用数字符号- 这就是不起作用的,OR 运算符,因为我可以插入数字和符号-,至少一个小写字母,至少一个大写字母和至少 8 个字符的长度.(){}?!$&%*=+-.

我尝试以|多种方式使用 OR 运算符,但我无法使其工作。

我错过了什么?非常感谢您提前。

注意:我在 liferay 配置文件中使用这个正则表达式来设置密码策略。

4

4 回答 4

3

您需要 XOR 逻辑运算,而不是 OR。

OR is true:
A |  B |  o/p
T |  T |   T
F |  T |   T
T |  F |   T
F |  F |   F

XOR is true:
A |  B | o/p
T |  T |  F
F |  T |  T
T |  F |  T
F |  F |  F

正则表达式中的异或

于 2012-07-12T16:23:37.543 回答
3

好的,我已经稍微改写了你的表达,这就是我想出的:

String pattern = "^(?=.*[\\d().{}?!$&*%=+_-])(?=.*[a-z])(?=.*[A-Z]).{8,}$";

这匹配任何字符串

  • 至少一个数字特殊字符
  • 至少一个小写字母
  • 至少有一个大写字母
  • 至少有 8 个字符长
于 2012-07-12T16:54:42.967 回答
2

我不得不说,虽然正则表达式可能可以做到这一点,但我认为使用多个正则表达式测试更简单、更安全,例如:

boolean containsDigit = Pattern.matches("[0-9]", testString);
boolean containsSymbol = Pattern.matches("[(){}?!$&%*=+.-]", testString);
boolean containsLowercase = Pattern.matches("[a-z]", testString);
boolean containsUppercase = Pattern.matches("[A-Z]", testString);

if(testString.length() >= 8
        && containsLowercase
        && containsUppercase
        && (containsDigit || containsSymbol)
        && !(containsDigit && containsSymbol)) {
    //valid
} else {
    //invalid
}

几个月前,我使用了一种 Java 正则表达式模式,它并不复杂,但它导致了一个 Java 错误的暴露。太多的括号子句似乎造成了麻烦,我不得不将模式拆分成更简单的东西。

以上内容比多子句正则表达式模式更具可读性,因此更易于维护和调试。

于 2012-07-12T19:20:41.503 回答
1

你说,

我可以插入数字和符号

这对于逻辑 OR 操作来说是正常的。听起来您想要的是异或(XOR)。恐怕我不知道您如何在正则表达式中做到这一点,但希望这会为您指明正确的方向。

于 2012-07-12T16:24:58.393 回答