Java 正则表达式不匹配
我正在尝试创建一个RegExp来匹配新密码(这很有效),但我只需要最后一步就可以让它100%工作 以下是RegExp及其支持的内容:Java 正则表达式不匹配,java,regex,liferay,Java,Regex,Liferay,我正在尝试创建一个RegExp来匹配新密码(这很有效),但我只需要最后一步就可以让它100%工作 以下是RegExp及其支持的内容: ((?=.*(\\d|[\\(\\)\\{\\}\\?!\\$&\\*%\\=\\+_\\-\\.]))(?=.*[a-z])(?=.*[A-Z]).{8,}) RegExp表示:数字或符号(){}?!$&%*=+-,这是不起作用的,OR运算符,因为我可以插入数字和符号,至少一个小写字母,至少一个大写字母,最小长度为8个字符 我试过用几种方法使用OR操作
((?=.*(\\d|[\\(\\)\\{\\}\\?!\\$&\\*%\\=\\+_\\-\\.]))(?=.*[a-z])(?=.*[A-Z]).{8,})
RegExp表示:数字或符号(){}?!$&%*=+-必须使用code>,这是不起作用的,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。在这一点上我很可能是错的,因为我对正则表达式不太熟悉。请注意,您不应该转义字符类中常见的特殊字符(在[]
中)。唯一的特殊字符是]
,\
,-
和^
。