2013-03-14 73 views
0

如何验证条件的正则表达式: 密码不得包含任何紧接着相同字符序列的字符序列。我有其他条件以及正在使用密码验证和UNICODE

(?=.*(..+)\\1) 

要验证立即序列重复。这是失败的。这段代码对于传递的第3个和第4个字符串返回“true”;我需要它返回false。请帮忙。

String s2[] = {"1newAb", "newAB1", "1234567AaAa", "123456ab3434", "love", "love1"}; 
    boolean b3; 
    for(int i=0; i<s2.length; i++){ 
     b3 = s2[i].matches("^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*(..+)\\1).{5,12}$"); 
     System.out.println("value" + b3); 
    } 
+1

学习使用正则表达式主控的秘密武器 - 在线测试工具! - > http://www.regexplanet.com/advanced/index.html(谷歌'正则表达式测试'为更多的选择)。 – 2013-03-14 02:06:04

+0

为什么你需要为此使用正则表达式? – Makoto 2013-03-14 02:06:24

+1

尽管学习正则表达式可能是一个很好的练习,但是您最好将每个规则的密码检查分开,并仅在需要的地方使用正则表达式,以改善代码维护和可读性。 – 2013-03-14 02:09:37

回答

1

您可以negative look-ahead(?!.*(.{2,})\\1)尝试。

对于那些谁知道什么\\1是:它代表了从第1组,这对我们来说是比赛从(.{2,})

+0

我非常需要任何序列(但我最初的代码是尝试2个字符)。我试过这个,它也没有为2个字符工作。我已经将其添加到我的代码中,并且失败了;它返回错误的“ADOALDO”这是我的模式。 (?=。* [a-zA-Z])(?!。*(。{2,})\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' 1){5,12} $“); – user1769790 2013-03-14 02:54:20

+0

@ user1769790看起来你的模式为'ADOALDO'返回false,因为它不包含任何数字 – Pshemo 2013-03-14 03:02:07

+0

你是对的我现在检查了它;这是我的不好。谢谢。我将按照规则分解代码;我想为每个正则表达式分割显示错误消息。我也加入了UNICODE,你的正则表达式也适用于UNICODE。谢谢! – user1769790 2013-03-14 03:04:32

0

与Ron的建议,我发现这方法在java中帮助匹配; matches(),find()的工作方式不同。 find()帮助了我。 Guido的建议是打破不同规则的代码。这是我的代码; (\ S +?)\ 1

String regex = "(\\S+?)\\1"; 
     String regex2 = "^(?=.*[0-9])(?=.*[a-zA-Z]).{5,12}$"; 
     p = Pattern.compile(regex); 
     for (String str : s2) { 
      matcher = p.matcher(str); 
      if (matcher.find()) 
       System.out.println(str + " got repeated: " + matcher.group(1)); 
      else if(str.matches(regex2)) 
       System.out.println(str + " Password correct"); 
      else 
       System.out.println(str + " Password incorrect"); 

     }