[英]Javascript Regular Expression for Password
我正在編寫用於驗證Javascript密碼的正則表達式。 約束是:
經過反復試驗和網上搜索,我發現這可行:
/(?=.*[A-Z]+)(?=.*[!@#\$%]+)/
有人可以解釋一下該表達式中提到大寫字母和特殊字符可以以任何順序出現的部分嗎?
?=
稱為前瞻,它將掃描字符串的其余部分以查看是否找到匹配項。 正常情況下,正則表達式逐個字符,但?=
告訴它“先行”以查看其是否存在。
否定的前瞻?!
。
我認為這樣做會更好:
/(?=.*[A-Z])(?=.*[!@#\$%])/
環顧四周不占用字符,因此,第二個前瞻的開始與第一個相同。 這使得檢查這兩個字符彼此獨立。 您可以交換它們,並且產生的正則表達式仍與此等效。
以下正則表達式(由Gumbo建議)效率更高,因為它避免了不必要的回溯:
/(?=[^A-Z]*[A-Z])(?=[^!@#\$%]*[!@#\$%])/
但是,對於通常長度的密碼,時間差可能很難測量。
“?=“就是這樣做的。 這是“積極的前瞻”
正向超前搜索會在字符串匹配模式開始的任何點匹配搜索字符串。 這是非捕獲性匹配,即不捕獲該匹配以供以后使用。 例如,“ Windows(?= 95 | 98 | NT | 2000)”與“ Windows 2000”中的“ Windows”匹配,而與“ Windows 3.1”中的“ Windows”匹配。 前瞻不消耗字符,也就是說,在匹配發生之后,對下一個匹配的搜索將在上一個匹配之后立即開始,而不是在組成先行的字符之后開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.