当我问表单校验的面试题时,我期望得到什么样的答案

2018-03-04  本文已影响0人  淼焱洞见

面试题

校验用户名表单,长度为8-10位的只包含数字和字母的字符串,用JavaScript实现一个校验函数。

1 解决过程

1.1 首先确认题目需求(几乎没有人确认过,当然也没有人写对过)

1.1.1 题目要求

1.1.2 Tips

1.2 其次分析思路(转换为可以写代码的等价逻辑表达,也没人写对过)

1.2.1 等价逻辑转换一

1.2.2 等价逻辑转换二

1.2.3 等价逻辑转换三

1.2.4 Tips

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 代码解释
1.3.1.3 逻辑表达

1.3.2 使用零宽负向先行断言

1.3.2.1 代码实现

/^(?!\d+$)(?![a-zA-Z]+$)[0-9a-zA-Z]{8,10}$/.test(str)

1.3.2.2 代码解释
1.3.2.3 逻辑表达
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 逻辑表达

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 常见问题

3 参考资料

3.1 正则书籍

3.2 正则工具

上一篇 下一篇

猜你喜欢

热点阅读