當我問表單校驗的面試題時,我期望得到什麼樣的答案
校驗使用者名稱錶單,長度為8-10位的只包含數字和字母的字串,用JavaScript實現一個校驗函式。
1 解決過程
1.1 首先確認題目需求(幾乎沒有人確認過,當然也沒有人寫對過)
1.1.1 題目要求
-
長度8-10位
-
只包含數字和字母
-
JS校驗函式
1.1.2 Tips
-
幾乎沒人確認過
-
沒人寫對過
-
如果這裡有問題,後面肯定對不了
1.2 其次分析思路(轉換為可以寫程式碼的等價邏輯表達,也沒人寫對過)
1.2.1 等價邏輯轉換一
-
包含字母
-
包含數字
-
只能是數字和字母
-
長度8-10位
1.2.2 等價邏輯轉換二
-
不 全為數字
-
不 全為字母
-
只能是數字和字母
-
長度8-10位
1.2.3 等價邏輯轉換三
-
所有字元ASCII碼在數字和字母的範圍內
-
長度8-10位
1.2.4 Tips
-
即使前面需求理解清楚,這裡轉換不等價也得不到正確的結果
-
有了這裡面的等價分解,最基本的TestCase也就有了,便於後面做校驗
-
即使寫不出程式碼來,這裡能說清楚也行
-
說不清楚也行,需要能看到不斷嘗試,積極思考的過程
1.3 然後是核心程式碼實現(清一色的正則,我們也先說正則)
1.3.1 使用零寬正向先行斷言
1.3.1.1 程式碼實現 /^(?=.*\d.*)(?=.*[a-zA-Z].*)[0-9a-zA-Z]{8,10}$/.test(str)
1.3.1.2 程式碼解釋
-
(?=)表達正向先行斷言,滿足條件的其他匹配結果才為真,即括號內的表示式匹配整個匹配結果才為真
-
可以出現在程式碼的任意位置
-
不佔用最終的匹配寬度
-
這裡表達既包含數字又包含字母的只包含數字和字母的8-10位的字串
-
包含數字
-
包含字母
-
8-10位的數字和字母的組合(全匹配)
1.3.2 使用零寬負向先行斷言
1.3.2.1 程式碼實現 /^(?!\d+$)(?![a-zA-Z]+$)[0-9a-zA-Z]{8,10}$/.test(str)
1.3.2.2 程式碼解釋
-
(?!) 表達負向先行斷言,滿足非條件的其他匹配結果才為真,即括號內的表示式不匹配整個匹配結果才為真
-
可以出現在程式碼的任意位置
-
不佔用最終的匹配寬度
-
這裡表達不全為數字且不全為字母的只包含數字和字母的8-10位的字串
-
不全為數字的(全匹配)
-
不全為字母的(全匹配)
-
8-10位的數字和字母的組合(全匹配)
1.3.3 如果不知道上面的方式,可以拆分一下
1.3.3.1 程式碼實現 !/^\d+$/.test(str) && !/^[a-zA-Z]+$/.test(str) && /^[0-9a-zA-Z]{8,10}$/.test(str)
1.3.3.2 程式碼解釋
-
不解釋了,直接的邏輯表達
-
不全為數字的(全匹配)
-
不全為字母的(全匹配)
-
8-10位的數字和字母的組合(全匹配)
1.3.4 如果不知道正則怎麼玩,也可以用字元判斷的方式
1.3.4.1 程式碼實現//考慮記不住ASCII碼 var rangeChars = '09azAZ'; var char0Code = rangeChars.charCodeAt(0), char9Code = rangeChars.charCodeAt(1), charaCode = rangeChars.charCodeAt(2), charzCode = rangeChars.charCodeAt(3), charACode = rangeChars.charCodeAt(4), charZCode = rangeChars.charCodeAt(5); Array.from(str).every(char => { return '0' <= char && char <= '9' || 'a' <= char && char <= 'z' || 'A' <= char && char <= 'Z' }); Array.from(str).some(char => { return '0' <= char && char <= '9' }); Array.from(str).some(char => { return 'a' <= char && char <= 'z' || 'A' <= char && char <= 'Z' }); 8 <= str.length && str.length <= 10
1.4 最後是結果的輸出
export const validationUtil = { isNameValid:(str) => { //呼叫isNameValid 的同時,不應該有判斷undefind,判斷null的過程,表單取出來的不會有這倆值 str += ''; str = str.trim(); return /^(?!\d+$)(?![a-zA-Z]+$)[0-9a-zA-Z]{8,10}$/.test(str); } }
2 常見問題
-
校驗不寫trim
-
正則不寫首尾匹配
-
/^[0-9a-zA-Z]{8,10}$/ 作為題目結果
-
自己寫出來的正則,自己也不知道啥意思
3 參考資料
3.1 正則書籍
-
基礎
-
學習正規表示式
-
正規表示式必知必會
-
神奇的匹配
-
-
進階
-
精通正規表示式
-
正則指引
-
3.2 正則工具
-
分析除錯工具
-
視覺化分析
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20597700/viewspace-2151490/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 當面試官問我JDK Semaphore的原理時,我笑了面試JDK
- 當面試官問我Mybatis初始化原理時,我笑了面試MyBatis
- 當我談自律的時候,我會談什麼(一)
- 面試官:你還有什麼想問我的?面試
- 當我談 HTTP 時,我談些什麼?HTTP
- 當面試官問你這個問題的時候,他想聽到什麼?面試
- 像蓋房子一樣寫程式碼:當我以測試驅動開發的時候,我在想些什麼
- 當我們在談零信任時,我們談的是什麼?
- 我的PHP面試題PHP面試題
- 美團面試官問我: ZGC 的 Z 是什麼意思面試GC
- 面試官問我:什麼是JavaScript閉包,我該如何回答面試JavaScript
- 我們在講的 Database Plus,到底能解決什麼樣的問題?Database
- 失格與超越:當我們在體驗遊戲世界的劇情時,我們想要什麼?遊戲
- 測試問題思考,有些問題我自己有答案,但是我想聽聽大家的見解,謝謝!
- 當我們談論Promise時,我們說些什麼Promise
- 當我們談優化時,我們談些什麼優化
- 為什麼想來我們公司工作?- 面試常見問題解析面試
- Troubleshooting 專題 - 問正確的問題 得到正確的答案
- 當我們說外掛系統的時候,我們在說什麼
- 作為技術面試官,我在面試時考慮什麼?面試
- 當我玩《魔獸世界》懷舊服,我在體驗什麼?
- 當我討論遊戲是否“好玩”時我在說什麼?遊戲
- 當我們談論MOD時,我們在談論什麼?
- 當我們聊kubernetes operator時,我們在聊些什麼
- 當我談跑酷遊戲時,我在談些什麼遊戲
- 面試官問我MySQL索引,我面試MySql索引
- 我遇見的那些面試題面試題
- 面試官:集合使用時應該注意哪些問題?我:應該注意該注意的問題!面試
- 面試官問我:什麼是訊息佇列?什麼場景需要他?用了會出現什麼問題?面試佇列
- “百度一下”後,你想得到什麼樣的答案?
- 當我有一臺雲伺服器時,我做了些什麼伺服器
- 當我們談深度學習時,我們用它落地了什麼?深度學習
- 當我們擔心人工智慧時,我們擔心什麼?人工智慧
- 分享30道Redis面試題,面試官能問到的我都找到了Redis面試題
- AI時代,我們到底需要什麼樣的“大腦”AI
- 當面試官說“你還有什麼問題想問的”,你該如何回答?面試
- 當面試官說 “你還有什麼問題想問的” ,你該如何回答?面試
- 當面試官說 “你還有什麼問題想問的”,你該如何回答?面試