關於“判斷字符串是否含有非法字符”的思考

項目案例

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

那思路很簡單呢,用中文字符正則表達式去檢查項目下文件路徑就好了不是嗎?
那這樣我們寫出的代碼是:

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

黑名單和白名單

什麼是黑白名單?針對本文案例,黑名單當然就是含中文字符、空格這些非法字符的字符串,而白名單就是我想要的,只包含英文、數字、下劃線、英文句點等字符的字符串。
那上面的思路就是基於黑名單的實現咯。

但是,我們仔細審查一下,會發現基於黑名單的排查,是極易出現紕漏的,以上方法就不能識別中文全角的括"("和")"。
因此更嚴謹的方法就是採用白名單實現,我們判斷字符串是不是我們想要的,實現如下:

//我們要求必須只能還有英文、數字、_、.、/、+、-、@、&這些字符
const regex = /^[A-Z0-9a-z()~_./+-@&]*$/;

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

這樣就萬無一失了。

思考

這種黑白名單的實現不僅能用在本文案例中,比如我們設計一個隨機算法,但是該隨機算法中需要把一些特殊情況排除掉的時候,我們的直接思維方式就是排除這些情況,那麼能不能反過來直接從生成的角度,不生成這些情況了。

這樣我們的代碼就會變得健壯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章