我正在尝试创建一个RegExp以匹配新密码(可行),但我只需要最后一步就能使其100%正常工作。
这是RegExp以及它的用途:
((?=.*(\\d|[\\(\\)\\{\\}\\?!\\$&\\*%\\=\\+_\\-\\.]))(?=.*[a-z])(?=.*[A-Z]).{8,})
RegExp表示:数字 OR 符号(){}?!$&%*=+-.
必须使用 - 这是不起作用的,OR运算符,因为我可以插入两者数字和符号 - ,至少一个小写,至少一个大写,最小长度为8个字符。
我尝试过以多种方式使用OR运算符|
,但我无法使其工作。
我错过了什么?非常感谢你提前。
注意:我在liferay配置文件中使用此正则表达式来获取密码策略。
答案 0 :(得分: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
答案 1 :(得分:3)
好的,我稍微改写了你的表达,这就是我提出的:
String pattern = "^(?=.*[\\d().{}?!$&*%=+_-])(?=.*[a-z])(?=.*[A-Z]).{8,}$";
这匹配任何带
的字符串答案 2 :(得分: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漏洞被揭示出来。太多令人满意的条款似乎造成了麻烦,我不得不将模式分解成更简单的东西。
上述内容比多子句正则表达式模式更易读,因此更易于维护和调试。
答案 3 :(得分:1)
你说,
我可以插入数字和符号
逻辑OR运算是正常的。听起来你想要的是独家或(XOR)。我担心我不知道你是如何在正则表达式中那样做的,但希望这会指出你正确的方向。