正则表达式不匹配

时间:2012-07-12 16:19:34

标签: java regex liferay

我正在尝试创建一个RegExp以匹配新密码(可行),但我只需要最后一步就能使其100%正常工作。

这是RegExp以及它的用途:

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

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

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

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

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

4 个答案:

答案 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

Exclusive Or in Regular Expression

答案 1 :(得分:3)

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

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

这匹配任何带

的字符串
  • 至少一个特殊字符
  • 至少一封小写字母
  • 至少一个大写字母
  • 至少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)。我担心我不知道你是如何在正则表达式中那样做的,但希望这会指出你正确的方向。

相关问题