2013-07-29 41 views
1

我想拒絕具有最少4個字符,最多39個字符,帶有-Z,A-Z,0-9, - ,_,@和的字符串的用戶名或密碼字符串。並且這些字符應該不是重複的,而是不像「aaaa」或「1234」或「abcd」和URL(HTTP-POST)那樣友好。我一直在努力研究String.matches()Java的正則表達式 - 字符串匹配 - 不重複,也不是不規則

零件最小4個字符,最多39個字符,帶a-z,A-Z,0-9似乎並不困難,但有沒有辦法在滿足所有這些要求的條件下測試字符串?

+0

我建議使用正則表達式只驗證長度和允許的字符,然後使用自定義Java函數掃描重複或遞增字符(如果輸入通過正則表達式)。除非通過遞增字符列出所有可能的字符串,否則正則表達式無法識別增量字符。 –

+1

「URL(HTTP-POST)友好」是什麼意思?這不僅僅是基於什麼字符是允許的,你已經列出了?無論如何,最好不要基於URL友好性來限制用戶名,而應該在生成URL之前調用URL編碼函數(將特殊字符更改爲像%xx這樣的實體),並在URL生成時調用URL解碼函數解釋URL。 –

+0

你不能做那種非增量的事情。正則表達式不是那樣的。 –

回答

0

我會單獨驗證所有這些東西。這將使所有驗證更簡單,更易於理解和維護。

另外你會知道哪些約束被違反,所以你可以向用戶報告更準確的錯誤(例如「密碼太短」而不是「你的密碼應該驗證以下約束:....」)。

  • 長度:使用String.length()
  • 允許字符:使用一個正則表達式:"^[a-zA-Z[email protected]\\.-]*$"
  • 非重複和無n遞增:正則表達式並不意味着這一點。正如在評論中提到的那樣,我會去進行自定義驗證(迭代輸入字符,檢測常量並增加字符序列)。這樣的東西應該工作:

    public boolean isBad(String test) { 
        int repeating = 0; 
        int incremental = 0; 
        for (int i = 1; i < test.length(); ++i) { 
         char prev = test.charAt(i - 1); 
         char curr = test.charAt(i); 
         if (prev == curr) { 
          repeating++; 
         } else { 
          repeating = 0; 
         } 
         if (curr - prev == 1) { 
          incremental++; 
         } else { 
          incremental = 0; 
         } 
         if (repeating == 3) { 
          System.out.println("too many repeated " + curr); 
          return true; 
         } 
         if(incremental==3){ 
          System.out.println("incrementing sequence"); 
          return true; 
         } 
        } 
        return false; 
    } 
    
  • 網址友好:你把字符集(字母數字和一些符號)的極限應該是足夠

相關問題