當我問表單校驗的面試題時,我期望得到什么樣的答案

面試題

校驗用戶名表單,長度為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位的字符串

1.3.1.3 邏輯表達
  • 包含數字

  • 包含字母

  • 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位的字符串

1.3.2.3 邏輯表達
  • 不全為數字的(全匹配)

  • 不全為字母的(全匹配)

  • 8-10位的數字和字母的組合(全匹配)

1.3.2.4

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 代碼解釋
  • 不解釋了,直接的邏輯表達
1.3.3.3 邏輯表達
  • 不全為數字的(全匹配)

  • 不全為字母的(全匹配)

  • 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 正則工具

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容

  • 初衷:看了很多視頻、文章,最后卻通通忘記了,別人的知識依舊是別人的,自己卻什么都沒獲得。此系列文章旨在加深自己的印...
    DCbryant閱讀 4,042評論 0 20
  • 正則表達式到底是什么東西?字符是計算機軟件處理文字時最基本的單位,可能是字母,數字,標點符號,空格,換行符,漢字等...
    獅子挽歌閱讀 2,161評論 0 9
  • 悟空,你是斗戰勝佛了 悟空,去把天庭打個粉碎 悟空,去把妖魔全部收服 悟空,打到九重天去吧 悟空,不要去 悟空,留...
    呆呆阿拉斯加閱讀 201評論 1 2
  • 新高考第一學霸:果然是得語文者得天下,經驗寶貴 你是不是被新高考狀元刷屏了? 2017年浙江新高考的最高分:諸暨中...
    愛享閱讀閱讀 589評論 0 0
  • 今日風騷未式微,恰逢春季競芳菲。 必須爭做新生代,豈可淪為復讀機。 但愿詩花能獨放,預期吟味莫相違。 詠言原本古今...
    雪窗_武立之閱讀 289評論 2 5