Java 正则表达式不匹配

Java 正则表达式不匹配,java,regex,liferay,Java,Regex,Liferay,我正在尝试创建一个RegExp来匹配新密码(这很有效),但我只需要最后一步就可以让它100%工作 以下是RegExp及其支持的内容: ((?=.*(\\d|[\\(\\)\\{\\}\\?!\\$&\\*%\\=\\+_\\-\\.]))(?=.*[a-z])(?=.*[A-Z]).{8,}) RegExp表示:数字或符号(){}?!$&%*=+-,这是不起作用的,OR运算符,因为我可以插入数字和符号,至少一个小写字母,至少一个大写字母,最小长度为8个字符 我试过用几种方法使用OR操作

我正在尝试创建一个RegExp来匹配新密码(这很有效),但我只需要最后一步就可以让它100%工作

以下是RegExp及其支持的内容:

((?=.*(\\d|[\\(\\)\\{\\}\\?!\\$&\\*%\\=\\+_\\-\\.]))(?=.*[a-z])(?=.*[A-Z]).{8,})
RegExp表示:数字符号
(){}?!$&%*=+-,这是不起作用的,OR运算符,因为我可以插入数字和符号,至少一个小写字母,至少一个大写字母,最小长度为8个字符

我试过用几种方法使用OR操作符
|
,但我无法让它工作

我错过了什么?事先非常感谢


注意:我正在liferay配置文件中为密码策略使用此正则表达式。

您需要的是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
你说过

我可以插入数字和符号


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

好的,我稍微重写了你的表达式,这就是我想到的:

String pattern = "^(?=.*[\\d().{}?!$&*%=+_-])(?=.*[a-z])(?=.*[A-Z]).{8,}$";
这将匹配任何具有

  • 至少一个数字或特殊字符
  • 至少一个小写字母
  • 至少有一个大写字母
  • 长度至少为8个字符

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

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 bug的暴露。太多的附加条款似乎造成了麻烦,我不得不将模式拆分为更简单的模式


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

据我所知,正则表达式中的OR运算符与大多数其他情况一样,是包含的,而不是独占的,因此它会将两者都视为ok。在这一点上我很可能是错的,因为我对正则表达式不太熟悉。请注意,您不应该转义字符类中常见的特殊字符(在
[]
中)。唯一的特殊字符是
]
\
-
^