2011-12-27 44 views
1

請給我正則表達式中用於密碼驗證的代碼,它應該由一個Caps字符,一個整數,一個跟隨符號(@,#,$,%,^,&,+ ,=)和小字符。注意java中的正則表達式和模式編譯

我一直在嘗試使用不同的單獨正則表達式和一個組合正則表達式。

其實我已經有一個正則表達式來評估JavaScript中的所有條件。 我無法在Java後端使用它。我試圖逃脫\。它也不起作用。

這裏是我的代碼:

Pattern pattern = Pattern.compile("/.*(?=.{6,})(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$/"); 
    Matcher matcher = pattern.matcher("[email protected]"); 
    if(matcher.matches()){ 
     System.out.println("Matched"); 
    } 
    else{ 
     System.out.println("No mat"); 
    } 

原來的JavaScript正則表達式是

/.*(?=.{6,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$/ 

在該\d給我的錯誤是由於逃逸字符。所以,我在Java版本中增加了另一個\

我無法理解發生了什麼問題。

在此先感謝。

+0

你應該舉例說明你試過的東西。 – gpojd 2011-12-27 15:04:51

+4

@anubhava,如果支持,可以很容易地用lookahead來完成。即使沒有環視,你也可以對可能的命令進行排列,雖然在這種情況下它不可行,但這是可能的。 – Qtax 2011-12-27 15:32:56

+0

@Qtax:是的,排列所有命令(並且會有很多),但是可能但不確定如何通過避免這些排列來輕鬆地使用lookahead來完成。 – anubhava 2011-12-27 15:40:10

回答

4

你幾乎沒有,但是你錯過了幾個細節:

首先,出發點是壞 - 那JavaScript的正則表達式是醜陋的。取而代之的

/.*(?=.{6,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$/ 

使用本:

/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).{6,}$/ 

然後,翻譯的正則表達式的Java,你需要刪除分隔符(並用引號代替,而不是另外像你這樣)和雙反斜線(就像你已經做過的):

Pattern pattern = Pattern.compile("^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).{6,}$"); 

現在它應該工作。

+0

雅真棒....謝謝...它運作良好 – user2587222 2011-12-28 05:08:52

+0

+1和如果這個答案解決了,那麼請標記爲接受。 – anubhava 2011-12-28 07:50:55

1

在Java中,您不需要/。它實際上會匹配一個斜線。另外,領導.*是無用的(儘管它不會影響結果)。

Pattern pattern = Pattern.compile("(?=.{6,})(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$"); 
+0

但是,這可能會影響處理時間,特別是如果驗證失敗。 – 2011-12-27 16:16:50

+0

我不認爲你需要最後的$。你也可以用你的前瞻來代替最後的決賽。 (?=。{6,})(?=。* \\ d)(?=。* [az])(?=。* [AZ])* – 2011-12-27 16:22:52

+0

我試着用編譯時間表達這兩個表達式。 (?=。* [@#$%^&+ =])。* $「)與tim的exp相比花費的時間更少。 – user2587222 2011-12-29 04:57:02