2013-03-14 70 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"); 

     }