项目案例
项目中遇到一项任务:禁止文件名含有中文字符、空格等非法字符的文件,在circleci持续整合中进行排查。
那思路很简单呢,用中文字符正则表达式去检查项目下文件路径就好了不是吗?
那这样我们写出的代码是:
const str = '我有中文字符';
if(/.*[\u4e00-\u9fa5]+.*$/.test(str)){
throw new Error('不能含有汉字');
}
黑名单和白名单
什么是黑白名单?针对本文案例,黑名单当然就是含中文字符、空格这些非法字符的字符串,而白名单就是我想要的,只包含英文、数字、下划线、英文句点等字符的字符串。
那上面的思路就是基于黑名单的实现咯。
但是,我们仔细审查一下,会发现基于黑名单的排查,是极易出现纰漏的,以上方法就不能识别中文全角的括”(”和”)”。
因此更严谨的方法就是采用白名单实现,我们判断字符串是不是我们想要的,实现如下:
//我们要求必须只能还有英文、数字、_、.、/、+、-、@、&这些字符
const regex = /^[A-Z0-9a-z()~_./+-@&]*$/;
if (!regex.test(path)) {
throw new Error('包含非法字符');
}
这样就万无一失了。
思考
这种黑白名单的实现不仅能用在本文案例中,比如我们设计一个随机算法,但是该随机算法中需要把一些特殊情况排除掉的时候,我们的直接思维方式就是排除这些情况,那么能不能反过来直接从生成的角度,不生成这些情况了。
这样我们的代码就会变得健壮。