2011-01-06 59 views
2
\A(?=\S*?[A-Z])(?=\S*?[a-z])(?=\S*?[0-9])\S{6,}\z 

(這來自JGSoft正則表達式的味道)。任何人都可以請解釋這個密碼複雜性正則表達式給我?

基本上,這個正則表達式的目的是這樣的:「密碼複雜 測試是否輸入由6個或更多字符 輸入必須包含至少一個大寫字母,一個小寫字母和一個數字。」。

因此,可以按任意順序放置三個組(第一個大寫字母,然後是非首字母,然後是數字)。 \ A匹配字符串的開頭,\ z匹配字符串的結尾。我對(?=部分)感到困惑,它應該是一個積極的向前看,我不明白這個正則表達式是如何讓你按任意順序輸入密碼字符的,

回答

4

看起來像你得到。基本思路想想看這樣的:從文本開始

  1. 外觀,同時在啓動:
    1. 檢查有至少一個大寫字母(只是看,不提前)
    2. 檢查是否有至少一個小寫字母
    3. 檢查至少有一位數字。
  2. 匹配至少6個非whitesapce字符到最後。

查找aheads不捕獲 - 你留在同一個位置(開始,在這種情況下),並檢查是否你這個比賽向前 - 這就是爲什麼順序並不重要

下面是一個示例,輸入爲[email protected]

  1. \A - 匹配字符串的開頭。大。
  2. (?=\S*?[A-Z]) - \S*?[A-Z]可匹配[email protected](?=)斷言成功。
  3. (?=\S*?[a-z]) - 可匹配[email protected]
  4. (?=\S*?[0-9]) - 可以匹配1
  5. \S{6,} - 匹配1 @ 34Ab,一直到最後(\z)。
1

先行意味着我測試是否有不改變5的位置,以便

  1. 它測試,如果從 字符串的開頭有零個或多個無 空白,接着上的圖案後者爲 。

  2. 然後它從 開始字符串的再次檢查是否存在 零個或多個無空白 隨後小寫後者。

  3. 那麼它從一開始 字符串的再次檢查,如果有 零個或多個無空格 其次是數字。

  4. 最後檢查字符串是否爲6 或更多沒有空格字符。

第一3個試驗(大寫,小寫,數字)先行 - 檢查是從字符串的開頭,而不改變位置只有最後試驗(6個或更多字符)改變位置。 lookahead是它的名字說的只是看看看到什麼而沒有移動,所以前三個測試是從字符串的開始執行的,所以順序並不重要,只要所有3都是正數就可以了。

相關問題