工作之余在codewars上看了一個問題,題目如下
寫一個正則,驗證密碼,保證以下幾點,
0.位數大于六
1.必須包含小寫字母
2.必須包含大寫字母
3.必須包含數字
好吧,我搞了半天沒搞出來,各位看官,你們知道怎么解嗎?
答案我參考了google,使用一條正則表達式是這樣的
function validate(password) { return /^(?=.*d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{6,}$/.test(password); }
這里包含了幾個基礎知識點,我說明一下
正則的主體是這個
/^[a-zA-Z0-9]{6,}$/
^,$代表從頭開始到結尾,量詞指示從頭到尾六次以上,匹配的內容是大小寫加數字
主體之外,用了三個前向斷言
我們先來看一下前向斷言的應用
"Windows (?=95|98|NT|2000)" 匹配“Windows 2000”中的“Windows”,但不匹配“Windows
3.1”中的“Windows”
主體,匹配的依然是主體windows,前向斷言的作用相當于一個篩選條件
所以,我們這里匹配的還是主體里那六個以上的字符,只是加了三個條件
三個什么條件?
(?=.*d)(?=.*[a-z])(?=.*[A-Z])
.*任意字符出現0或多次后面跟d數字,意思是只有要數字,甭管他前面有或沒有任意字符,有幾個任意字符,我們都要。
同理后面的小寫,大寫。
而且這三個斷言相當于“并”的關系。
我們再組合來看是不是更明白一些了?
^(?=.*d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{6,}$
這句的意思是我們要從開始到結束6個以上字符,他們的條件有三個,出現過數字,小寫,大寫
以上是普通青年解法
那這作弊來的答案,也是頗有成就感的,心想這種問題不會有其他答案了吧,但答題者的想象力再次超過了我的想象,以下是其他幾種答案,供擴展思路之用
function validate(password) { return /^[A-Za-z0-9]{6,}$/.test(password) && /[A-Z]+/ .test(password) && /[a-z]+/ .test(password) && /[0-9]+/ .test(password) ; }
進行了四個正則驗證,用&&相連,避免了正則內部的斷言,這是文藝青年解法
下面還有鉛筆青年解法,就看看
function validate(password) { // 1) if the first char is [0-9]: // a) verify what follows contains at least 1 [a-z] // b) verify what follows contains at least 1 [A-Z] // c) verify what follows contains only [0-9a-zA-Z] and at least 5 of them // 2) if the first char is [a-z]: // a) verify what follows contains at least 1 [0-9] // b) verify what follows contains at least 1 [A-Z] // c) verify what follows contains only [0-9a-zA-Z] and at least 5 of them // 3) if the first char is [A-Z]: // a) verify what follows contains at least 1 [a-z] // b) verify what follows contains at least 1 [0-9] // c) verify what follows contains only [0-9a-zA-Z] and at least 5 of them return /^(([0-9](?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z]))([0-9a-zA-z]{5,})|([a-z](?=[^0-9]*[0-9])(?=[^A-Z]*[A-Z]))([0-9a-zA-z]{5,})|([A-Z](?=[^a-z]*[a-z])(?=[^0-9]*[0-9]))([0-9a-zA-z]{5,}))$/.test(password); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/87574.html
摘要:其實昨天晚上我看到最逗得一段代碼是這樣的,老外的創造力真是震古爍今啊,題目是寫一個函數查找素數。 這兩天有點迷Codewars , 這上面的好處是獎勵系統,我為了升段位晚上像打游戲升級一樣的在做js習題,想想老外哪怕這簡單網站的任務系統做的可真夠好啊。 先給大家介紹第一道 六段題(一共8kyu,kyu上面還有dan,數字越小越難) 題目: 創造一個函數,返回如下這么個玩意,參數...
摘要:利潤是怎樣煉成的怪獸的屬性怪獸的技能大木博士的圖鑒你是趙老爺家的算帳二狗子,趙家老爺想要學習一些理財知識,就去詢問孔乙己。 [7 kyu]Money, Money, Money 利潤是怎樣煉成的??2016.03.15 怪獸的屬性: showImg(http://ww2.sinaimg.cn/large/006m2mhTgw1f1xxc38fbqj30qa0s2q6f.jpg);sho...
摘要:,黑色的主題風格,很符合。時間復雜度雖然成功,但我明顯感覺代碼寫得不是很優雅。這個是沒錯的,但缺乏了宏觀的視角,會變得片面。但是不重要,關鍵是這個思想要學習,可以應用到其他地方。求和,大于就返回偶數的位置,否則返回奇數的位置。 前幾天做LeetCode上的大數乘法,代碼沒錯,可就是提交不成功,顯示SyntaxError: Unexpected token var我把所有代碼都注釋掉,只...
摘要:我對數據結構的學習最近在上做了一道題目,嗯,我這個渣渣沒有做出來,然后看了別人的解決方案,是時候學習一下的了。。。。。讀取對應的鍵值,如果找不到返回鍵是函數返回一個布爾值,表示某個鍵是否在數據結構中。 我對ES6數據結構Map的學習 最近在CodeWars上做了一道題目,嗯,我這個渣渣沒有做出來,然后看了別人的解決方案,Map??? 是時候學習一下ES6的Map了。。。。。 以下是原題...
摘要:二進制加農炮問題描述驗證方式題目理解把兩個數的和轉換成二進制并以字符串的形式輸出。和當前位數數的大小來決定。優解使用了的添加了檢測輸入的參數合理否。通過執行取余除二取反來實現知識點二進制如何轉十進制,十進制如何轉二進制 [7 kyu]Binary Addition 二進制加農炮??2016.03.11 問題描述: showImg(http://ww3.sinaimg.cn/large/...
閱讀 3203·2021-09-06 15:02
閱讀 2248·2019-08-30 15:48
閱讀 3446·2019-08-29 11:08
閱讀 3289·2019-08-26 13:55
閱讀 2448·2019-08-26 13:35
閱讀 3166·2019-08-26 12:11
閱讀 2602·2019-08-26 11:48
閱讀 888·2019-08-26 11:42