2012-06-04 64 views
4
/(?=^.{8,}$)(?=.*[[email protected]#$%^&*-])(?=.*\d)(?=.*\W+)(?![.\n])(?=.*[a-z])(?=.*[A-Z]).*$/ 

我試圖做出密碼驗證一個正則表達式的特殊字符,使得密碼必須至少8個字符,其中包括一個大寫,一個小寫,一個數字和一個特殊焦炭。它工作正常,但不會將下劃線(_)識別爲特殊字符。即,Pa $$ w0rd匹配,但Pass_w0rd不匹配。思考?正則表達式不承認強調

+3

答案其實很簡單。你沒有在你的特殊字符中加入'_'。 – OmnipotentEntity

+0

這是一些看起來很邪惡的正則表達式。你確定你想用這樣的正則表達式嗎?隨着需求變化,可能難以維持。 –

+1

David B,實際上是因爲這個正則表達式使用了前瞻斷言,所以它對於可維護性來說可能是很好的。每個部分都是模塊化的,不依賴於任何其他部分。 – OmnipotentEntity

回答

3

正則表達式的這部分似乎是在尋找特殊字符:

(?=.*[[email protected]#$%^&*-]) 

注意字符類不包括下劃線,試試這個更改爲以下幾點:

(?=.*[[email protected]#$%^&*-]) 

你還需要修改或刪除該正則表達式的該部分:

(?=.*\W+) 

\W相當於[^a-zA-Z0-9_],所以如果下劃線是你唯一的特殊字符,這部分正則表達式會導致它失敗。相反,它更改爲以下(或刪除它,它是多餘的,因爲你已經檢查特殊字符或更早):

(?=.*[^\w_]) 

完整的正則表達式:

/(?=^.{8,}$)(?=.*[[email protected]#$%^&*-])(?=.*\d)(?=.*[^\w_])(?![.\n])(?=.*[a-z])(?=.*[A-Z]).*$/ 
+1

糟糕,忘記在我的代碼片段中包含該修訂。它仍然不接受Pass_w0rd :( – user1436111

+0

@ user1436111 - 看到我的編輯,它應該現在工作 –

0

問題是唯一的事情,根據定義,可能滿足\W[a-zA-Z0-9_]以外的其他東西。下劃線與\WPass_w0rd沒有任何匹配。

我懷疑有兩個特殊字符的列表\W是矯枉過正。挑一個,你很可能會更開心。我還建議把這整個事情分成幾個獨立的測試,以提高可維護性。

+0

謝謝!我真的在正則表達式可怕,但你知道我可以修復它嗎? – user1436111

+0

我已經添加了一個可能的解決方案 –

+0

謝謝你,那個作品! – user1436111

0

,你的作品一個更簡單的正則表達式是這樣的:

/(?=.*[[email protected]#$%^&*-])(?=.*\d)(?!.*[.\n])(?=.*[a-z])(?=.*[A-Z])^.{8,}$/ 

有在你原來的正則表達式如一些錯誤:

  • 你並不需要使用前瞻爲確保有是8個字符在輸入
  • 負先行[.\n]缺失.*
  • (?=.*\W+)是多餘的,並且可能沒有達到任何目的
+1

非常感謝! – user1436111

1

這一個這裏工作以及。它通過排除字母數字字符和空格來定義一個特殊字符,所以它包含下劃線:

(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[\d])(?=.*?[^\sa-zA-Z0-9]).{8,} 
+0

這似乎適合所有人物。但是不佔空間 –