关于“判断字符串是否含有非法字符”的思考

项目案例

项目中遇到一项任务:禁止文件名含有中文字符、空格等非法字符的文件,在circleci持续整合中进行排查。

那思路很简单呢,用中文字符正则表达式去检查项目下文件路径就好了不是吗?
那这样我们写出的代码是:

const str = '我有中文字符';
if(/.*[\u4e00-\u9fa5]+.*$/.test(str)){ 
    throw new Error('不能含有汉字');
} 

黑名单和白名单

什么是黑白名单?针对本文案例,黑名单当然就是含中文字符、空格这些非法字符的字符串,而白名单就是我想要的,只包含英文、数字、下划线、英文句点等字符的字符串。
那上面的思路就是基于黑名单的实现咯。

但是,我们仔细审查一下,会发现基于黑名单的排查,是极易出现纰漏的,以上方法就不能识别中文全角的括”(”和”)”。
因此更严谨的方法就是采用白名单实现,我们判断字符串是不是我们想要的,实现如下:

//我们要求必须只能还有英文、数字、_、.、/、+、-、@、&这些字符
const regex = /^[A-Z0-9a-z()~_./+-@&]*$/;

if (!regex.test(path)) {
    throw new Error('包含非法字符');
}

这样就万无一失了。

思考

这种黑白名单的实现不仅能用在本文案例中,比如我们设计一个随机算法,但是该随机算法中需要把一些特殊情况排除掉的时候,我们的直接思维方式就是排除这些情况,那么能不能反过来直接从生成的角度,不生成这些情况了。

这样我们的代码就会变得健壮。

    原文作者:littleTommyTan
    原文地址: https://segmentfault.com/a/1190000017008832
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞