2010-06-21 97 views
1

我正在寫Javascript驗證密碼的正則表達式。約束條件是:Javascript正則表達式的密碼

  1. 密碼必須包含至少一個大寫字符
  2. 密碼必須包含至少一個特殊字符

隨着試驗和錯誤,並在網上一番搜索,我發現,這工作原理:

/(?=.*[A-Z]+)(?=.*[[email protected]#\$%]+)/ 

是否有人可以解釋這種表達,其中提到了大寫字母和特殊字符可以進來的任何命令的一部分嗎?

+1

你不需要加量詞。你爲什麼要逃避'*'? – SilentGhost 2010-06-21 15:13:54

+0

我很抱歉...由於格式問題而逃脫了*。它在我第一次發佈時沒有顯示。也許想到標記賦予了特殊的含義,從而逃脫了它。 – atlantis 2010-06-21 15:50:45

+0

好的,那就讓我們忘記它吧。 – SilentGhost 2010-06-21 16:05:00

回答

2

我認爲這將更好的工作:

/(?=.*[A-Z])(?=.*[[email protected]#\$%])/ 

查找變通不消耗字符,因此,開始第二先行相同爲先。這使得檢查這兩個角色彼此獨立。你可以交換它們,並且生成的正則表達式仍然等同於此。

以下的正則表達式(由濃湯建議的)稍微更有效,因爲它避免了不必要的回溯:

/(?=[^A-Z]*[A-Z])(?=[^[email protected]#\$%]*[[email protected]#\$%])/ 

在通常的長度的密碼的時間差可能不會容易測量,雖然。

+0

我覺得'+'是所需的'特殊字符'之一。而不是完全刪除它,它應該在字符類'[]' – 2010-06-21 15:22:09

+0

@理查德:加號也用於第一次預測,因此,我認爲它用作量詞。這並非完全錯誤,它只是多餘的。 – SilentGhost 2010-06-21 15:23:29

+0

@SilentGhost - 這是真的;我第一次沒有注意到它。 – 2010-06-21 15:29:58

1

「?=」這樣做。這是一個「積極先行」

JavaScript Regular Expression Syntax

正向前查找搜索字符串在其中一個字符串匹配模式開頭的點相匹配。這是一個不捕獲的匹配,也就是說,匹配不會被捕獲以備將來使用。例如,「Windows(?= 95 | 98 | NT | 2000)」與「Windows 2000」中的「Windows」匹配,但與「Windows 3.1」中的「Windows」匹配。預覽不會消耗字符,也就是說,匹配發生後,搜索下一場比賽會在最後一場比賽之後立即開始,而不是在構成預測的角色之後開始。

+0

謝謝。 Silentghost的迴應具有細節。 – atlantis 2010-06-21 16:06:37

+0

該鏈接非常有用...再次感謝! – atlantis 2010-06-21 16:10:08

2

?=被稱爲超前測試,它將掃描字符串的其餘部分以查看是否找到匹配項。通常,正則表達式逐個字符地逐個字符,但?=告訴它「向前看」它是否存在。

還有一個?!負面超前。

+0

謝謝。 Silentghost的迴應具有細節。 – atlantis 2010-06-21 16:06:01