2011-05-17 46 views
7
  1. 包含至少8個字符。
  2. 包含大寫和小寫字母。
  3. 包含數字或其他非字母字符。

上述標準可能是什麼規定?正則表達式至少包含8個+上下限+數字或其他非字母表

我創建一個支票更強的密碼:)

C#我使用

+0

你必須使用正則表達式嗎?我沒有任何反對,但對於標準1,可能更容易使用字符串長度函數。這是什麼語言? – chillysapien 2011-05-17 10:03:23

+2

這不是你的問題的答案,但我想推薦一些閱讀,瞭解爲什麼強迫用戶輸入你正在檢查的密碼是一種不好的做法:http://www.baekdal.com/tips/password-安全性 - 可用性 – 2011-05-17 10:04:04

+1

[RegEx表達式驗證輸入字符串]的可能重複(http://stackoverflow.com/questions/1124796/regex-expression-to-validate-the-input-string) – 2011-05-17 11:18:54

回答

13

這應做到:

(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[^a-zA-Z]).{8,} 

在這裏看到:rubular

解釋:

(?=.*?[a-z]) //lookahead, there has to be a lower case alphabetic char 
(?=.*?[A-Z]) //lookahead, there has to be a upper case alphabetic char 
(?=.*?[^a-zA-Z]) //lookahead, there has to be a non-alphabetic char 
.{8,} // any character at least 8 times 
+0

哪一組元素指定特殊租船人在這裏? – 2011-05-17 12:19:22

+0

[^ a-zA-Z]表示除字母字符以外的任何內容。 – morja 2011-05-17 12:35:58

11

不要試圖對所有規則使用一個正則表達式 - 這很難,而且更重要的是它很難被未來的程序員閱讀和修改。相反,爲每個規則寫一個函數。對第一條規則使用字符串長度函數,然後對大寫字母,小寫字母和數字使用單獨的正則表達式(或對字符串的簡單掃描)。

那麼你的測試變得像:

if (len(password) >= 8 && 
    contains_lower(password) && 
    contains_upper(password) && 
    contains_number(password)) { 
    ... 
} 

您的代碼成爲其意圖非常清楚,如果你要改變只有一種算法,你不必重新發明一個複雜的正則表達式。另外,您可以單獨測試每個規則。

與此相比,一個例子有人在另一個答案寫了這個問題:

(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[^a-zA-Z]).{8,} 

這兩個答案看起來更容易理解,更容易修改,更容易測試?你甚至無法猜測正則表達式在做什麼,直到你花費了幾個(或許多)時間來研究它。如果需求變爲「..並且至少有一個下劃線」會怎麼樣?你如何改變這種模式,尤其是當你不是一開始就想出這種模式的人時?

+0

+1奇妙 - 我不知道爲什麼我沒有想到10000000x之前更清晰! – Dori 2013-02-26 12:41:06

+0

不使用正則表達式的另一個重要原因是它們使得不可能告訴用戶哪些部分的需求是他的密碼不符合 – 2016-08-12 09:49:59

相關問題