我正在寫Javascript驗證密碼的正則表達式。約束條件是:Javascript正則表達式的密碼
- 密碼必須包含至少一個大寫字符
- 密碼必須包含至少一個特殊字符
隨着試驗和錯誤,並在網上一番搜索,我發現,這工作原理:
/(?=.*[A-Z]+)(?=.*[[email protected]#\$%]+)/
是否有人可以解釋這種表達,其中提到了大寫字母和特殊字符可以進來的任何命令的一部分嗎?
我正在寫Javascript驗證密碼的正則表達式。約束條件是:Javascript正則表達式的密碼
隨着試驗和錯誤,並在網上一番搜索,我發現,這工作原理:
/(?=.*[A-Z]+)(?=.*[[email protected]#\$%]+)/
是否有人可以解釋這種表達,其中提到了大寫字母和特殊字符可以進來的任何命令的一部分嗎?
我認爲這將更好的工作:
/(?=.*[A-Z])(?=.*[[email protected]#\$%])/
查找變通不消耗字符,因此,開始第二先行相同爲先。這使得檢查這兩個角色彼此獨立。你可以交換它們,並且生成的正則表達式仍然等同於此。
以下的正則表達式(由濃湯建議的)稍微更有效,因爲它避免了不必要的回溯:
/(?=[^A-Z]*[A-Z])(?=[^[email protected]#\$%]*[[email protected]#\$%])/
在通常的長度的密碼的時間差可能不會容易測量,雖然。
我覺得'+'是所需的'特殊字符'之一。而不是完全刪除它,它應該在字符類'[]' – 2010-06-21 15:22:09
@理查德:加號也用於第一次預測,因此,我認爲它用作量詞。這並非完全錯誤,它只是多餘的。 – SilentGhost 2010-06-21 15:23:29
@SilentGhost - 這是真的;我第一次沒有注意到它。 – 2010-06-21 15:29:58
「?=」這樣做。這是一個「積極先行」
從JavaScript Regular Expression Syntax
正向前查找搜索字符串在其中一個字符串匹配模式開頭的點相匹配。這是一個不捕獲的匹配,也就是說,匹配不會被捕獲以備將來使用。例如,「Windows(?= 95 | 98 | NT | 2000)」與「Windows 2000」中的「Windows」匹配,但與「Windows 3.1」中的「Windows」匹配。預覽不會消耗字符,也就是說,匹配發生後,搜索下一場比賽會在最後一場比賽之後立即開始,而不是在構成預測的角色之後開始。
?=
被稱爲超前測試,它將掃描字符串的其餘部分以查看是否找到匹配項。通常,正則表達式逐個字符地逐個字符,但?=
告訴它「向前看」它是否存在。
還有一個?!
負面超前。
謝謝。 Silentghost的迴應具有細節。 – atlantis 2010-06-21 16:06:01
你不需要加量詞。你爲什麼要逃避'*'? – SilentGhost 2010-06-21 15:13:54
我很抱歉...由於格式問題而逃脫了*。它在我第一次發佈時沒有顯示。也許想到標記賦予了特殊的含義,從而逃脫了它。 – atlantis 2010-06-21 15:50:45
好的,那就讓我們忘記它吧。 – SilentGhost 2010-06-21 16:05:00